-
Notifications
You must be signed in to change notification settings - Fork 1
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: findMemberIdAfterSaveMember 메서드와 관련된 로직과 도메인을 분리 #68
Changes from all commits
5d38298
79deff3
62b96b3
7d3c360
a7f4358
64086ff
7abef25
9927e9b
694ea96
504facf
3116c26
12c3001
5ae5838
a9e23a1
143b42a
c0ea9a9
d99b23e
9e24966
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,111 +1,14 @@ | ||
package com.wypl.wyplcore.auth.service; | ||
|
||
import java.time.LocalDate; | ||
|
||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; | ||
import com.wypl.googleoauthclient.GoogleOAuthClient; | ||
import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; | ||
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; | ||
import com.wypl.googleoauthclient.domain.AuthMember; | ||
import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; | ||
import com.wypl.googleoauthclient.exception.GoogleOAuthException; | ||
import com.wypl.jpamemberdomain.member.OauthProvider; | ||
import com.wypl.jpamemberdomain.member.data.MemberSaveDto; | ||
import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; | ||
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; | ||
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; | ||
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; | ||
import com.wypl.wyplcore.member.service.MemberServiceImpl; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Transactional(readOnly = true) | ||
@RequiredArgsConstructor | ||
@Service | ||
public class AuthServiceImpl { | ||
private final GoogleOAuthClient googleOAuthClient; | ||
private final SocialMemberRepository socialMemberRepository; | ||
private final AuthDomainServiceImpl authDomainService; | ||
private final MemberServiceImpl memberService; | ||
|
||
@Transactional | ||
public AuthTokensResponse generateToken(final String provider, final String code) { | ||
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code); | ||
|
||
GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( | ||
googleTokenResponse.accessToken()); | ||
|
||
long memberId = findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); | ||
|
||
authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); | ||
|
||
return AuthTokensResponse.of(memberId, googleTokenResponse); | ||
} | ||
|
||
@Transactional | ||
public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken) { | ||
if (isInvalidRefreshToken(accessToken, refreshToken)) { | ||
throw new GoogleOAuthException(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER); | ||
} | ||
|
||
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken); | ||
|
||
authDomainService.deleteToken(accessToken); | ||
authDomainService.saveToken(googleTokenResponse.accessToken(), refreshToken); | ||
|
||
return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken); | ||
} | ||
|
||
@Transactional | ||
public void logout(AuthMember authMember) { | ||
deleteToken(authMember); | ||
} | ||
|
||
@Transactional | ||
public void quitMember(AuthMember authMember) { | ||
// Todo : 회원 탈퇴 로직 논의 | ||
deleteToken(authMember); | ||
memberService.deleteMember(authMember); | ||
} | ||
|
||
private void deleteToken(AuthMember authMember) { | ||
authDomainService.deleteToken(authMember.accessToken()); | ||
} | ||
|
||
private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { | ||
return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken)); | ||
} | ||
|
||
// todo: | ||
private long findMemberIdAfterSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) { | ||
if (isNewMember(googleUserInfoResponse)) { | ||
LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken); | ||
|
||
MemberSaveDto memberSaveDto = MemberSaveDto.builder() | ||
.email(googleUserInfoResponse.email()) | ||
.birthday(birthday) | ||
.nickname(googleUserInfoResponse.name()) | ||
.profileImage(googleUserInfoResponse.picture()) | ||
.build(); | ||
|
||
SocialMemberSaveDto socialMemberSaveDto = SocialMemberSaveDto.builder() | ||
.oauthProvider(OauthProvider.GOOGLE) | ||
.oauthId(googleUserInfoResponse.id()) | ||
.build(); | ||
|
||
return authDomainService.saveAuthData(memberSaveDto, socialMemberSaveDto); | ||
} | ||
|
||
return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId(); | ||
} | ||
|
||
// todo: | ||
private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { | ||
return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, | ||
googleUserInfoResponse.id()); | ||
} | ||
} | ||
|
||
// package com.wypl.wyplcore.auth.service; | ||
// | ||
// import org.springframework.stereotype.Service; | ||
// import org.springframework.transaction.annotation.Transactional; | ||
// | ||
// import lombok.RequiredArgsConstructor; | ||
// | ||
// @Transactional(readOnly = true) | ||
// @RequiredArgsConstructor | ||
// @Service | ||
// public class AuthServiceImpl { | ||
// | ||
// } | ||
// |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.wypl.wyplcore.facade; | ||
|
||
import com.wypl.googleoauthclient.domain.AuthMember; | ||
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; | ||
|
||
public interface AuthMemberFacade { | ||
AuthTokensResponse generateToken(final String provider, final String code); | ||
AuthTokensResponse reissueToken(final String accessToken, final String refreshToken); | ||
void logout(final AuthMember authMember); | ||
void quitMember(final AuthMember authMember); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,78 @@ | ||||||
package com.wypl.wyplcore.facade; | ||||||
|
||||||
import org.springframework.stereotype.Component; | ||||||
import org.springframework.transaction.annotation.Transactional; | ||||||
|
||||||
import com.wypl.googleoauthclient.GoogleOAuthClient; | ||||||
import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; | ||||||
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; | ||||||
import com.wypl.googleoauthclient.domain.AuthMember; | ||||||
import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; | ||||||
import com.wypl.googleoauthclient.exception.GoogleOAuthException; | ||||||
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; | ||||||
import com.wypl.wyplcore.member.service.MemberService; | ||||||
import com.wypl.wyplcore.token.service.TokenService; | ||||||
|
||||||
import lombok.RequiredArgsConstructor; | ||||||
|
||||||
@Transactional(readOnly = true) | ||||||
@RequiredArgsConstructor | ||||||
@Component | ||||||
public class AuthMemberFacadeImpl implements AuthMemberFacade { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
어떠한 기능을 하는 서비스가 있는데 해당 서비스를 구성한 디자인패턴과 같은.. 내용을 클래스에 붙힘 |
||||||
private final GoogleOAuthClient googleOAuthClient; | ||||||
private final TokenService tokenService; | ||||||
private final MemberService memberService; | ||||||
|
||||||
@Override | ||||||
@Transactional | ||||||
public AuthTokensResponse generateToken(final String provider, final String code) { | ||||||
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code); | ||||||
|
||||||
GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( | ||||||
googleTokenResponse.accessToken()); | ||||||
|
||||||
long memberId = memberService.findMemberIdOrSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); | ||||||
|
||||||
tokenService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); | ||||||
|
||||||
return AuthTokensResponse.of(memberId, googleTokenResponse); | ||||||
} | ||||||
|
||||||
@Override | ||||||
@Transactional | ||||||
public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken) { | ||||||
if (isInvalidRefreshToken(accessToken, refreshToken)) { | ||||||
throw new GoogleOAuthException(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER); | ||||||
} | ||||||
|
||||||
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken); | ||||||
|
||||||
tokenService.deleteToken(accessToken); | ||||||
tokenService.saveToken(googleTokenResponse.accessToken(), refreshToken); | ||||||
|
||||||
return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken); | ||||||
} | ||||||
|
||||||
@Override | ||||||
@Transactional | ||||||
public void logout(final AuthMember authMember) { | ||||||
deleteToken(authMember); | ||||||
} | ||||||
|
||||||
@Override | ||||||
@Transactional | ||||||
public void quitMember(final AuthMember authMember) { | ||||||
// Todo : 회원 탈퇴 로직 논의 | ||||||
// Todo : deleteToken은 스프링에서 비동기 처리하고(토큰이 아니라 멤버 탈퇴가 중요한거다), deleteMember는 Member 쪽으로 옮기자 | ||||||
deleteToken(authMember); | ||||||
memberService.deleteMember(authMember); | ||||||
} | ||||||
|
||||||
private void deleteToken(AuthMember authMember) { | ||||||
tokenService.deleteToken(authMember.accessToken()); | ||||||
} | ||||||
|
||||||
private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { | ||||||
return refreshToken.isEmpty() || !refreshToken.equals(tokenService.getRefreshToken(accessToken)); | ||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package com.wypl.wyplcore.member.service; | ||
|
||
import java.time.LocalDate; | ||
|
||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.wypl.googleoauthclient.GoogleOAuthClient; | ||
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; | ||
import com.wypl.googleoauthclient.domain.AuthMember; | ||
import com.wypl.jpamemberdomain.member.OauthProvider; | ||
import com.wypl.jpamemberdomain.member.data.MemberSaveDto; | ||
import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; | ||
import com.wypl.jpamemberdomain.member.domain.Member; | ||
import com.wypl.jpamemberdomain.member.domain.SocialMember; | ||
import com.wypl.jpamemberdomain.member.repository.MemberRepository; | ||
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; | ||
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Transactional(readOnly = true) | ||
@RequiredArgsConstructor | ||
@Service | ||
public class MemberService { | ||
private final GoogleOAuthClient googleOAuthClient; | ||
private final MemberRepository memberRepository; | ||
private final SocialMemberRepository socialMemberRepository; | ||
|
||
@Transactional | ||
public void deleteMember(AuthMember authMember) { | ||
memberRepository.deleteById(authMember.id()); | ||
} | ||
|
||
@Transactional | ||
public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) { | ||
if (isNewMember(googleUserInfoResponse)) { | ||
LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken); | ||
|
||
MemberSaveDto memberSaveDto = MemberSaveDto.builder() | ||
.email(googleUserInfoResponse.email()) | ||
.birthday(birthday) | ||
.nickname(googleUserInfoResponse.name()) | ||
.profileImage(googleUserInfoResponse.picture()) | ||
.build(); | ||
|
||
SocialMemberSaveDto socialMemberSaveDto = SocialMemberSaveDto.builder() | ||
.oauthProvider(OauthProvider.GOOGLE) | ||
.oauthId(googleUserInfoResponse.id()) | ||
.build(); | ||
|
||
return saveNewMember(memberSaveDto, socialMemberSaveDto); | ||
} | ||
|
||
return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId(); | ||
} | ||
|
||
private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { | ||
return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, | ||
googleUserInfoResponse.id()); | ||
} | ||
|
||
private long saveNewMember(MemberSaveDto memberSaveDto, SocialMemberSaveDto socialMemberSaveDto) { | ||
Member newMember = memberRepository.save(Member.of(memberSaveDto)); | ||
SocialMember socialMember = socialMemberRepository.save(SocialMember.of(newMember, socialMemberSaveDto)); | ||
return socialMember.getId(); | ||
} | ||
} |
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
개인적으로 뒤에 Service를 붙여주면 좋을 것 같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Facade는 필요한 Service를 조합해서 사용하기 때문에 Facade Layer와 Service Layer를 명확히 구분하기 위해서 Service는 붙이지 않았습니다!
이 부분에 대해서는 어떻게 생각하시나요?