Skip to content

Commit

Permalink
Fix:탈퇴한 회원 재가입 (#173)
Browse files Browse the repository at this point in the history
* feat: 재가입 유저시 기존의 providerId, nickName 사용하지않는 값으로 변경하는 메서드 구현

* refactor: 회원가입시 만약 탈퇴한 회원이면 재가입 로직을 수행하게 변경

* refactor: 전체생생자 추가

* test: 탈퇴회원 재가입 테스트 작성

* test: 탈퇴회원 재가입 테스트 작성

* fix: 닉네임은 변경 x
  • Loading branch information
kimJH47 authored Feb 16, 2024
1 parent 5e382f4 commit b453de2
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,23 @@
import com.salmalteam.salmal.auth.exception.AuthException;
import com.salmalteam.salmal.auth.exception.AuthExceptionType;
import com.salmalteam.salmal.member.application.MemberService;
import com.salmalteam.salmal.member.entity.MemberRepository;
import com.salmalteam.salmal.member.entity.Status;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class AuthService {

private final TokenProvider jwtProvider;
private final TokenProvider refreshTokenProvider;
private final TokenRepository tokenRepository;
private final MemberService memberService;

public AuthService(TokenProvider jwtProvider, TokenProvider refreshTokenProvider, TokenRepository tokenRepository,
MemberService memberService) {
this.jwtProvider = jwtProvider;
this.refreshTokenProvider = refreshTokenProvider;
this.tokenRepository = tokenRepository;
this.memberService = memberService;
}
private final MemberRepository memberRepository;

@Transactional
public LoginResponse login(final LoginRequest loginRequest) {
Expand All @@ -46,10 +44,20 @@ public LoginResponse login(final LoginRequest loginRequest) {

@Transactional
public LoginResponse signUp(final String provider, final SignUpRequest signUpRequest) {
if (checkRejoin(signUpRequest.getProviderId())) {
final Long memberId = memberService.rejoin(provider,signUpRequest.getProviderId(),signUpRequest.getNickName(),signUpRequest.getMarketingInformationConsent());
return generateTokenById(memberId);
}
final Long memberId = memberService.save(provider, signUpRequest);
return generateTokenById(memberId);
}

private boolean checkRejoin(String providerId) {
return memberRepository.findByProviderId(providerId)
.map(m-> m.getStatus().equals(Status.REMOVED))
.orElse(false);
}

//TODO 리프래시 토큰 저장타입 개선
private LoginResponse generateTokenById(final Long memberId) {
Map<String, Object> payload = createPayloadWithIdClaim(memberId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,4 +267,17 @@ public boolean isActivatedId(Long memberId) {
.map(member -> !member.isRemoved())
.orElse(false);
}

@Transactional
public Long rejoin(String provider, String providerId, String nickName, Boolean marketingInformationConsent) {

Member removedMember = memberRepository.findByProviderId(providerId)
.orElseThrow(() -> new MemberException(MemberExceptionType.NOT_FOUND));
removedMember.rejoin();

validateNickNameExists(nickName);
return memberRepository.save(
Member.createActivatedMember(providerId, nickName, provider, marketingInformationConsent))
.getId();
}
}
6 changes: 6 additions & 0 deletions src/main/java/com/salmalteam/salmal/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.salmalteam.salmal.common.entity.BaseEntity;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -21,6 +22,7 @@
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@EqualsAndHashCode(of = {"id"}, callSuper = true)
@Table(name = "member")
public class Member extends BaseEntity {
Expand Down Expand Up @@ -89,4 +91,8 @@ public boolean isRemoved() {
public void remove() {
status = Status.REMOVED;
}

public void rejoin() {
providerId = "#####################";
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.salmalteam.salmal.member.entity;

import javax.persistence.Column;
import javax.persistence.Embeddable;

import com.salmalteam.salmal.member.exception.MemberException;
import com.salmalteam.salmal.member.exception.MemberExceptionType;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Getter
@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -29,7 +30,7 @@ public static NickName from(final String value) {
return new NickName(value);
}

private void validateNickName(final String value) {
private void validateNickName(final String value) {
if (isNotValidLength(value)) {
throw new MemberException(MemberExceptionType.INVALID_NICKNAME_LENGTH);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package com.salmalteam.salmal.application.auth;

import static com.salmalteam.salmal.member.entity.Provider.*;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -27,6 +30,13 @@
import com.salmalteam.salmal.auth.infrastructure.JwtProvider;
import com.salmalteam.salmal.auth.infrastructure.RefreshTokenProvider;
import com.salmalteam.salmal.member.application.MemberService;
import com.salmalteam.salmal.member.entity.Introduction;
import com.salmalteam.salmal.member.entity.Member;
import com.salmalteam.salmal.member.entity.MemberImage;
import com.salmalteam.salmal.member.entity.MemberRepository;
import com.salmalteam.salmal.member.entity.NickName;
import com.salmalteam.salmal.member.entity.Setting;
import com.salmalteam.salmal.member.entity.Status;

@ExtendWith(MockitoExtension.class)
class AuthServiceTest {
Expand All @@ -40,10 +50,13 @@ class AuthServiceTest {
TokenRepository tokenRepository;
@Mock
MemberService memberService;
@Mock
MemberRepository memberRepository;

@BeforeEach
void setUp() {
authService = new AuthService(jwtProvider, refreshTokenProvider, tokenRepository, memberService);
authService = new AuthService(jwtProvider, refreshTokenProvider, tokenRepository, memberService,
memberRepository);
}

@Nested
Expand Down Expand Up @@ -78,7 +91,6 @@ class 로그인_테스트 {
class 회원_가입_테스트 {
@Test
void 접근_토큰과_재발급_토큰을_발급한다() {

// given
final Long memberId = 1L;
final String nickName = "닉네임";
Expand All @@ -95,6 +107,9 @@ class 회원_가입_테스트 {
given(memberService.save(eq(providerId), any())).willReturn(memberId);
given(jwtProvider.provide(eq(payload))).willReturn(accessToken);
given(refreshTokenProvider.provide(eq(payload))).willReturn(refreshToken);
given(memberRepository.findByProviderId(anyString())).willReturn(
Optional.of(Member.createActivatedMember(providerId, nickName, "KAKAO",
true)));

// when
final LoginResponse loginResponse = authService.signUp(providerId, signUpRequest);
Expand All @@ -104,6 +119,50 @@ class 회원_가입_테스트 {
() -> assertThat(loginResponse).isEqualTo(LoginResponse.of(accessToken, refreshToken)),
() -> verify(tokenRepository, times(1)).saveRefreshToken(any(RefreshToken.class))
);

then(memberRepository).should(times(1)).findByProviderId(anyString());
then(memberService).should(times(1)).save(anyString(), any(SignUpRequest.class));
then(jwtProvider).should(times(1)).provide(eq(payload));
then(refreshTokenProvider).should(times(1)).provide(eq(payload));
}

@Test
@DisplayName("탈퇴된 회원 재가입 테스트")
void rejoin() {
// given
final Long memberId = 100L;
final String nickName = "닉네임";
final Boolean marketingInformationConsent = false;
final String accessToken = "accessToken";
final String refreshToken = "refreshToken";
final String providerId = "providerId";
final Map<String, Object> payload = new HashMap<>();
payload.put("id", memberId);
payload.put("role", Role.MEMBER);
final SignUpRequest signUpRequest = new SignUpRequest(providerId, nickName,
marketingInformationConsent);
Member member = new Member(memberId, providerId, KAKAO, NickName.from(nickName), Introduction.from("test"),
Setting.of(true),
MemberImage.initMemberImage(), Status.REMOVED);
given(jwtProvider.provide(eq(payload))).willReturn(accessToken);
given(refreshTokenProvider.provide(eq(payload))).willReturn(refreshToken);
given(memberRepository.findByProviderId(anyString())).willReturn(Optional.of(member));
given(memberService.rejoin(anyString(), anyString(), anyString(), anyBoolean())).willReturn(memberId);
// when
final LoginResponse loginResponse = authService.signUp(providerId, signUpRequest);

// then
assertAll(
() -> assertThat(loginResponse).isEqualTo(LoginResponse.of(accessToken, refreshToken)),
() -> verify(tokenRepository, times(1)).saveRefreshToken(any(RefreshToken.class))
);

then(memberRepository).should(times(1)).findByProviderId(anyString());
then(memberService).should(times(0)).save(anyString(), any(SignUpRequest.class));
then(memberService).should(times(1)).rejoin(anyString(), anyString(), anyString(), anyBoolean());
then(jwtProvider).should(times(1)).provide(eq(payload));
then(refreshTokenProvider).should(times(1)).provide(eq(payload));

}

@Nested
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.salmalteam.salmal.application.member;

import static com.salmalteam.salmal.member.entity.Provider.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;
Expand All @@ -22,9 +23,14 @@
import com.salmalteam.salmal.member.dto.request.MemberImageUpdateRequest;
import com.salmalteam.salmal.member.dto.request.MyPageUpdateRequest;
import com.salmalteam.salmal.member.dto.request.block.MemberBlockedPageRequest;
import com.salmalteam.salmal.member.entity.Introduction;
import com.salmalteam.salmal.member.entity.Member;
import com.salmalteam.salmal.member.entity.MemberBlockedRepository;
import com.salmalteam.salmal.member.entity.MemberImage;
import com.salmalteam.salmal.member.entity.MemberRepository;
import com.salmalteam.salmal.member.entity.NickName;
import com.salmalteam.salmal.member.entity.Setting;
import com.salmalteam.salmal.member.entity.Status;
import com.salmalteam.salmal.member.exception.MemberException;
import com.salmalteam.salmal.member.exception.MemberExceptionType;
import com.salmalteam.salmal.member.exception.block.MemberBlockedException;
Expand Down Expand Up @@ -420,5 +426,37 @@ void isActivatedId_true() {
then(memberRepository).should(times(1)).findById(anyLong());

}

@Test
@DisplayName("탈퇴된 회원의 providerId 와 nickname 변경하고 새로운 회원을 저장한다.")
void rejoin() {
//given
long memberId = 150L;
String providerId = "providerId";
String nickName = "testNickName";

Member removedMember = new Member(111111L, providerId, KAKAO, NickName.from(nickName), Introduction.from("test"),
Setting.of(true),
MemberImage.initMemberImage(), Status.REMOVED);

Member newMember = new Member(memberId, providerId, KAKAO, NickName.from("newNickName"), Introduction.from("test"),
Setting.of(true),
MemberImage.initMemberImage(), Status.ACTIVATED);

given(memberRepository.findByProviderId(anyString())).willReturn(Optional.of(removedMember));
given(memberRepository.save(any(Member.class))).willReturn(newMember);
given(memberRepository.existsByNickName(any(NickName.class))).willReturn(false);

//when
long actual = memberService.rejoin("KAKAO", providerId, nickName, false);

//then
assertThat(actual).isEqualTo(150L);
then(memberRepository).should(times(1)).findByProviderId(anyString());
then(memberRepository).should(times(1)).existsByNickName(any(NickName.class));
then(memberRepository).should(times(1)).save(any(Member.class));


}
}
}

0 comments on commit b453de2

Please sign in to comment.