Skip to content

Commit 534d9cf

Browse files
authored
Merge pull request #68 from What-s-Your-Plan/feat/#67
Refactor: findMemberIdAfterSaveMember 메서드와 관련된 로직과 도메인을 분리
2 parents 0078793 + 9e24966 commit 534d9cf

File tree

21 files changed

+838
-641
lines changed

21 files changed

+838
-641
lines changed

application/wypl-core/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ dependencies {
1818
implementation project(':domain:jpa-member-domain')
1919
implementation project(':domain:auth-domain')
2020
implementation project(':domain:redis-embedded-domain')
21+
implementation project(':domain:redis-token-domain')
2122
implementation project(':common')
2223

2324
implementation 'org.springframework.boot:spring-boot-starter-actuator'

application/wypl-core/src/main/java/com/wypl/wyplcore/auth/controller/AuthController.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@
1212
import com.wypl.googleoauthclient.annotation.Authenticated;
1313
import com.wypl.googleoauthclient.domain.AuthMember;
1414
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse;
15-
import com.wypl.wyplcore.auth.service.AuthServiceImpl;
15+
import com.wypl.wyplcore.facade.AuthMemberFacade;
1616

1717
import lombok.RequiredArgsConstructor;
1818

1919
@RequiredArgsConstructor
2020
@RequestMapping("/auth")
2121
@RestController
2222
public class AuthController {
23-
private final AuthServiceImpl authService;
23+
private final AuthMemberFacade authMemberFacade;
2424

2525
@PostMapping("/v1/sign-in/{provider}")
2626
public WyplResponseEntity<AuthTokensResponse> signIn(
2727
@PathVariable("provider") String provider,
2828
@RequestParam("code") String code
2929
) {
30-
AuthTokensResponse response = authService.generateToken(provider, code);
30+
AuthTokensResponse response = authMemberFacade.generateToken(provider, code);
3131
return WyplResponseEntity.ok(response, "로그인에 성공하였습니다.");
3232
}
3333

@@ -36,15 +36,15 @@ public WyplResponseEntity<AuthTokensResponse> reissue(
3636
@RequestParam("access_token") String accessToken,
3737
@RequestParam("refresh_token") String refreshToken
3838
) {
39-
AuthTokensResponse response = authService.reissueToken(accessToken, refreshToken);
39+
AuthTokensResponse response = authMemberFacade.reissueToken(accessToken, refreshToken);
4040
return WyplResponseEntity.created(response, "토큰 재발급에 성공하였습니다.");
4141
}
4242

4343
@DeleteMapping("/v1/logout")
4444
public WyplResponseEntity<Void> logout(
4545
@Authenticated AuthMember authMember
4646
) {
47-
authService.logout(authMember);
47+
authMemberFacade.logout(authMember);
4848
return WyplResponseEntity.ok("로그아웃에 성공하였습니다.");
4949
}
5050
}

application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.springframework.stereotype.Component;
44

5-
import com.wypl.authdomain.auth.service.AuthDomainServiceImpl;
65
import com.wypl.googleoauthclient.GoogleOAuthClient;
76
import com.wypl.googleoauthclient.data.response.GoogleTokenValidationResponse;
87
import com.wypl.googleoauthclient.domain.AuthMember;
@@ -12,6 +11,7 @@
1211
import com.wypl.jpamemberdomain.member.domain.SocialMember;
1312
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository;
1413
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils;
14+
import com.wypl.wyplcore.token.service.TokenService;
1515

1616
import lombok.RequiredArgsConstructor;
1717

@@ -20,7 +20,7 @@
2020
public class AuthMemberServiceImpl implements AuthMemberService {
2121
private final GoogleOAuthClient googleOAuthClient;
2222
private final SocialMemberRepository socialMemberRepository;
23-
private final AuthDomainServiceImpl authDomainService;
23+
private final TokenService tokenService;
2424

2525
@Override
2626
public AuthMember getValidatedMemberId(String accessToken) {
@@ -37,7 +37,7 @@ private GoogleTokenValidationResponse getGoogleTokenValidationResponse(String ac
3737
try {
3838
return googleOAuthClient.validateToken(accessToken);
3939
} catch (GoogleOAuthException e) {
40-
if (authDomainService.checkExistsToken(accessToken)) {
40+
if (tokenService.checkExistsToken(accessToken)) {
4141
throw new GoogleOAuthException(GoogleOAuthErrorCode.REFRESH_TOKEN);
4242
}
4343
throw new GoogleOAuthException(GoogleOAuthErrorCode.INVALID_TOKEN);
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,14 @@
1-
package com.wypl.wyplcore.auth.service;
2-
3-
import java.time.LocalDate;
4-
5-
import org.springframework.stereotype.Service;
6-
import org.springframework.transaction.annotation.Transactional;
7-
8-
import com.wypl.authdomain.auth.service.AuthDomainServiceImpl;
9-
import com.wypl.googleoauthclient.GoogleOAuthClient;
10-
import com.wypl.googleoauthclient.data.response.GoogleTokenResponse;
11-
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse;
12-
import com.wypl.googleoauthclient.domain.AuthMember;
13-
import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode;
14-
import com.wypl.googleoauthclient.exception.GoogleOAuthException;
15-
import com.wypl.jpamemberdomain.member.OauthProvider;
16-
import com.wypl.jpamemberdomain.member.data.MemberSaveDto;
17-
import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto;
18-
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository;
19-
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils;
20-
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse;
21-
import com.wypl.wyplcore.member.service.MemberServiceImpl;
22-
23-
import lombok.RequiredArgsConstructor;
24-
25-
@Transactional(readOnly = true)
26-
@RequiredArgsConstructor
27-
@Service
28-
public class AuthServiceImpl {
29-
private final GoogleOAuthClient googleOAuthClient;
30-
private final SocialMemberRepository socialMemberRepository;
31-
private final AuthDomainServiceImpl authDomainService;
32-
private final MemberServiceImpl memberService;
33-
34-
@Transactional
35-
public AuthTokensResponse generateToken(final String provider, final String code) {
36-
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code);
37-
38-
GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo(
39-
googleTokenResponse.accessToken());
40-
41-
long memberId = findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse);
42-
43-
authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken());
44-
45-
return AuthTokensResponse.of(memberId, googleTokenResponse);
46-
}
47-
48-
@Transactional
49-
public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken) {
50-
if (isInvalidRefreshToken(accessToken, refreshToken)) {
51-
throw new GoogleOAuthException(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER);
52-
}
53-
54-
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken);
55-
56-
authDomainService.deleteToken(accessToken);
57-
authDomainService.saveToken(googleTokenResponse.accessToken(), refreshToken);
58-
59-
return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken);
60-
}
61-
62-
@Transactional
63-
public void logout(AuthMember authMember) {
64-
deleteToken(authMember);
65-
}
66-
67-
@Transactional
68-
public void quitMember(AuthMember authMember) {
69-
// Todo : 회원 탈퇴 로직 논의
70-
deleteToken(authMember);
71-
memberService.deleteMember(authMember);
72-
}
73-
74-
private void deleteToken(AuthMember authMember) {
75-
authDomainService.deleteToken(authMember.accessToken());
76-
}
77-
78-
private boolean isInvalidRefreshToken(String accessToken, String refreshToken) {
79-
return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken));
80-
}
81-
82-
// todo:
83-
private long findMemberIdAfterSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) {
84-
if (isNewMember(googleUserInfoResponse)) {
85-
LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken);
86-
87-
MemberSaveDto memberSaveDto = MemberSaveDto.builder()
88-
.email(googleUserInfoResponse.email())
89-
.birthday(birthday)
90-
.nickname(googleUserInfoResponse.name())
91-
.profileImage(googleUserInfoResponse.picture())
92-
.build();
93-
94-
SocialMemberSaveDto socialMemberSaveDto = SocialMemberSaveDto.builder()
95-
.oauthProvider(OauthProvider.GOOGLE)
96-
.oauthId(googleUserInfoResponse.id())
97-
.build();
98-
99-
return authDomainService.saveAuthData(memberSaveDto, socialMemberSaveDto);
100-
}
101-
102-
return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId();
103-
}
104-
105-
// todo:
106-
private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) {
107-
return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE,
108-
googleUserInfoResponse.id());
109-
}
110-
}
111-
1+
// package com.wypl.wyplcore.auth.service;
2+
//
3+
// import org.springframework.stereotype.Service;
4+
// import org.springframework.transaction.annotation.Transactional;
5+
//
6+
// import lombok.RequiredArgsConstructor;
7+
//
8+
// @Transactional(readOnly = true)
9+
// @RequiredArgsConstructor
10+
// @Service
11+
// public class AuthServiceImpl {
12+
//
13+
// }
14+
//
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.wypl.wyplcore.facade;
2+
3+
import com.wypl.googleoauthclient.domain.AuthMember;
4+
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse;
5+
6+
public interface AuthMemberFacade {
7+
AuthTokensResponse generateToken(final String provider, final String code);
8+
AuthTokensResponse reissueToken(final String accessToken, final String refreshToken);
9+
void logout(final AuthMember authMember);
10+
void quitMember(final AuthMember authMember);
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.wypl.wyplcore.facade;
2+
3+
import org.springframework.stereotype.Component;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
import com.wypl.googleoauthclient.GoogleOAuthClient;
7+
import com.wypl.googleoauthclient.data.response.GoogleTokenResponse;
8+
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse;
9+
import com.wypl.googleoauthclient.domain.AuthMember;
10+
import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode;
11+
import com.wypl.googleoauthclient.exception.GoogleOAuthException;
12+
import com.wypl.wyplcore.auth.data.response.AuthTokensResponse;
13+
import com.wypl.wyplcore.member.service.MemberService;
14+
import com.wypl.wyplcore.token.service.TokenService;
15+
16+
import lombok.RequiredArgsConstructor;
17+
18+
@Transactional(readOnly = true)
19+
@RequiredArgsConstructor
20+
@Component
21+
public class AuthMemberFacadeImpl implements AuthMemberFacade {
22+
private final GoogleOAuthClient googleOAuthClient;
23+
private final TokenService tokenService;
24+
private final MemberService memberService;
25+
26+
@Override
27+
@Transactional
28+
public AuthTokensResponse generateToken(final String provider, final String code) {
29+
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code);
30+
31+
GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo(
32+
googleTokenResponse.accessToken());
33+
34+
long memberId = memberService.findMemberIdOrSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse);
35+
36+
tokenService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken());
37+
38+
return AuthTokensResponse.of(memberId, googleTokenResponse);
39+
}
40+
41+
@Override
42+
@Transactional
43+
public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken) {
44+
if (isInvalidRefreshToken(accessToken, refreshToken)) {
45+
throw new GoogleOAuthException(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER);
46+
}
47+
48+
GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken);
49+
50+
tokenService.deleteToken(accessToken);
51+
tokenService.saveToken(googleTokenResponse.accessToken(), refreshToken);
52+
53+
return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken);
54+
}
55+
56+
@Override
57+
@Transactional
58+
public void logout(final AuthMember authMember) {
59+
deleteToken(authMember);
60+
}
61+
62+
@Override
63+
@Transactional
64+
public void quitMember(final AuthMember authMember) {
65+
// Todo : 회원 탈퇴 로직 논의
66+
// Todo : deleteToken은 스프링에서 비동기 처리하고(토큰이 아니라 멤버 탈퇴가 중요한거다), deleteMember는 Member 쪽으로 옮기자
67+
deleteToken(authMember);
68+
memberService.deleteMember(authMember);
69+
}
70+
71+
private void deleteToken(AuthMember authMember) {
72+
tokenService.deleteToken(authMember.accessToken());
73+
}
74+
75+
private boolean isInvalidRefreshToken(String accessToken, String refreshToken) {
76+
return refreshToken.isEmpty() || !refreshToken.equals(tokenService.getRefreshToken(accessToken));
77+
}
78+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.wypl.wyplcore.member.service;
2+
3+
import java.time.LocalDate;
4+
5+
import org.springframework.stereotype.Service;
6+
import org.springframework.transaction.annotation.Transactional;
7+
8+
import com.wypl.googleoauthclient.GoogleOAuthClient;
9+
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse;
10+
import com.wypl.googleoauthclient.domain.AuthMember;
11+
import com.wypl.jpamemberdomain.member.OauthProvider;
12+
import com.wypl.jpamemberdomain.member.data.MemberSaveDto;
13+
import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto;
14+
import com.wypl.jpamemberdomain.member.domain.Member;
15+
import com.wypl.jpamemberdomain.member.domain.SocialMember;
16+
import com.wypl.jpamemberdomain.member.repository.MemberRepository;
17+
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository;
18+
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils;
19+
20+
import lombok.RequiredArgsConstructor;
21+
22+
@Transactional(readOnly = true)
23+
@RequiredArgsConstructor
24+
@Service
25+
public class MemberService {
26+
private final GoogleOAuthClient googleOAuthClient;
27+
private final MemberRepository memberRepository;
28+
private final SocialMemberRepository socialMemberRepository;
29+
30+
@Transactional
31+
public void deleteMember(AuthMember authMember) {
32+
memberRepository.deleteById(authMember.id());
33+
}
34+
35+
@Transactional
36+
public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) {
37+
if (isNewMember(googleUserInfoResponse)) {
38+
LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken);
39+
40+
MemberSaveDto memberSaveDto = MemberSaveDto.builder()
41+
.email(googleUserInfoResponse.email())
42+
.birthday(birthday)
43+
.nickname(googleUserInfoResponse.name())
44+
.profileImage(googleUserInfoResponse.picture())
45+
.build();
46+
47+
SocialMemberSaveDto socialMemberSaveDto = SocialMemberSaveDto.builder()
48+
.oauthProvider(OauthProvider.GOOGLE)
49+
.oauthId(googleUserInfoResponse.id())
50+
.build();
51+
52+
return saveNewMember(memberSaveDto, socialMemberSaveDto);
53+
}
54+
55+
return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId();
56+
}
57+
58+
private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) {
59+
return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE,
60+
googleUserInfoResponse.id());
61+
}
62+
63+
private long saveNewMember(MemberSaveDto memberSaveDto, SocialMemberSaveDto socialMemberSaveDto) {
64+
Member newMember = memberRepository.save(Member.of(memberSaveDto));
65+
SocialMember socialMember = socialMemberRepository.save(SocialMember.of(newMember, socialMemberSaveDto));
66+
return socialMember.getId();
67+
}
68+
}

application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java

-21
This file was deleted.

0 commit comments

Comments
 (0)