|
1 | 1 | package org.terning.terningserver.auth.application; |
2 | 2 |
|
3 | 3 | import lombok.RequiredArgsConstructor; |
| 4 | +import org.springframework.context.ApplicationEventPublisher; |
4 | 5 | import org.springframework.stereotype.Service; |
5 | 6 | import org.springframework.transaction.annotation.Transactional; |
6 | | -import org.terning.terningserver.auth.application.reissue.AuthReissueService; |
7 | | -import org.terning.terningserver.auth.application.signin.AuthSignInService; |
8 | | -import org.terning.terningserver.auth.application.signout.AuthSignOutService; |
9 | | -import org.terning.terningserver.auth.application.signup.AuthSignUpService; |
10 | | -import org.terning.terningserver.auth.application.syncUser.AuthSyncUserService; |
11 | | -import org.terning.terningserver.auth.application.withdraw.AuthWithdrawService; |
| 7 | +import org.terning.terningserver.auth.application.social.SocialAuthProvider; |
| 8 | +import org.terning.terningserver.auth.application.social.SocialAuthServiceManager; |
| 9 | +import org.terning.terningserver.auth.common.exception.AuthErrorCode; |
| 10 | +import org.terning.terningserver.auth.common.exception.AuthException; |
| 11 | +import org.terning.terningserver.auth.dto.Token; |
12 | 12 | import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; |
13 | 13 | import org.terning.terningserver.auth.dto.request.SignInRequest; |
14 | | -import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto; |
15 | | -import org.terning.terningserver.auth.dto.request.SignUpRequestDto; |
16 | | -import org.terning.terningserver.auth.dto.response.AccessTokenGetResponseDto; |
| 14 | +import org.terning.terningserver.auth.dto.request.SignUpFilterRequest; |
| 15 | +import org.terning.terningserver.auth.dto.request.SignUpRequest; |
17 | 16 | import org.terning.terningserver.auth.dto.response.SignInResponse; |
18 | | -import org.terning.terningserver.auth.dto.response.SignUpResponseDto; |
| 17 | +import org.terning.terningserver.auth.dto.response.SignUpResponse; |
| 18 | +import org.terning.terningserver.auth.dto.response.TokenReissueResponse; |
| 19 | +import org.terning.terningserver.auth.jwt.JwtProvider; |
| 20 | +import org.terning.terningserver.auth.jwt.exception.JwtErrorCode; |
| 21 | +import org.terning.terningserver.auth.jwt.exception.JwtException; |
| 22 | +import org.terning.terningserver.external.pushNotification.notification.NotificationUserClient; |
| 23 | +import org.terning.terningserver.filter.domain.Filter; |
| 24 | +import org.terning.terningserver.filter.repository.FilterRepository; |
| 25 | +import org.terning.terningserver.user.application.UserService; |
| 26 | +import org.terning.terningserver.user.domain.User; |
| 27 | +import org.terning.terningserver.user.event.UserSignedUpEvent; |
| 28 | +import org.terning.terningserver.user.repository.UserRepository; |
19 | 29 |
|
20 | 30 | @Service |
21 | 31 | @RequiredArgsConstructor |
22 | 32 | @Transactional(readOnly = true) |
23 | 33 | public class AuthService { |
24 | 34 |
|
25 | | - private final AuthSignInService authSignInService; |
26 | | - private final AuthSignUpService authSignUpService; |
27 | | - private final AuthSignOutService authSignOutService; |
28 | | - private final AuthWithdrawService authWithdrawService; |
29 | | - private final AuthReissueService authReissueService; |
30 | | - private final AuthSyncUserService authSyncUserService; |
| 35 | + private final UserService userService; |
| 36 | + private final UserRepository userRepository; |
| 37 | + private final JwtProvider jwtProvider; |
| 38 | + private final SocialAuthServiceManager socialAuthServiceManager; |
| 39 | + private final ApplicationEventPublisher eventPublisher; |
| 40 | + private final NotificationUserClient notificationUserClient; |
| 41 | + private final FilterRepository filterRepository; |
31 | 42 |
|
32 | 43 | @Transactional |
33 | | - public SignInResponse signIn(String authAccessToken, SignInRequest request) { |
34 | | - SignInResponse signInResponse = authSignInService.signIn(authAccessToken, request); |
35 | | - return signInResponse; |
| 44 | + public SignInResponse signIn(String socialAccessToken, SignInRequest request) { |
| 45 | + SocialAuthProvider provider = socialAuthServiceManager.getAuthService(request.authType()); |
| 46 | + String authId = provider.getAuthId(socialAccessToken); |
| 47 | + |
| 48 | + User user = userRepository.findByAuthIdAndAuthType(authId, request.authType()) |
| 49 | + .orElse(null); |
| 50 | + |
| 51 | + if (user == null) { |
| 52 | + return SignInResponse.ofNewUser(authId, request.authType()); |
| 53 | + } |
| 54 | + |
| 55 | + Token token = jwtProvider.generateTokens(user.getId()); |
| 56 | + user.updateRefreshToken(token.refreshToken()); |
| 57 | + userRepository.save(user); |
| 58 | + |
| 59 | + return SignInResponse.ofExistingUser(token, authId, request.authType(), user.getId()); |
36 | 60 | } |
37 | 61 |
|
38 | 62 | @Transactional |
39 | | - public SignUpResponseDto signUp(String authId, SignUpRequestDto request) { |
40 | | - SignUpResponseDto signUpResponseDto = authSignUpService.signUp(authId, request); |
41 | | - return signUpResponseDto; |
| 63 | + public SignUpResponse signUp(String authId, SignUpRequest request) { |
| 64 | + if (userRepository.existsByAuthIdAndAuthType(authId, request.authType())) { |
| 65 | + throw new AuthException(AuthErrorCode.USER_ALREADY_EXIST); |
| 66 | + } |
| 67 | + |
| 68 | + User userToSave = User.from(authId, request); |
| 69 | + userRepository.save(userToSave); |
| 70 | + |
| 71 | + Token token = jwtProvider.generateTokens(userToSave.getId()); |
| 72 | + userToSave.updateRefreshToken(token.refreshToken()); |
| 73 | + |
| 74 | + eventPublisher.publishEvent(UserSignedUpEvent.of(userToSave, request.fcmToken())); |
| 75 | + |
| 76 | + notificationUserClient.createUserOnNotificationServer( |
| 77 | + userToSave.getId(), |
| 78 | + userToSave.getName(), |
| 79 | + userToSave.getAuthType(), |
| 80 | + request.fcmToken() |
| 81 | + ); |
| 82 | + |
| 83 | + return SignUpResponse.of(token, userToSave); |
42 | 84 | } |
43 | 85 |
|
44 | 86 | @Transactional |
45 | | - public void registerFilterWithUser(Long userId, SignUpFilterRequestDto request) { |
46 | | - authSignUpService.registerFilterWithUser(userId, request); |
| 87 | + public void registerUserFilter(Long userId, SignUpFilterRequest request) { |
| 88 | + User user = userRepository.findById(userId) |
| 89 | + .orElseThrow(() -> new AuthException(AuthErrorCode.USER_NOT_FOUND)); |
| 90 | + |
| 91 | + Filter newFilter = Filter.from(request); |
| 92 | + filterRepository.save(newFilter); |
| 93 | + |
| 94 | + user.assignFilter(newFilter); |
47 | 95 | } |
48 | 96 |
|
49 | 97 | @Transactional |
50 | 98 | public void signOut(long userId) { |
51 | | - authSignOutService.signOut(userId); |
| 99 | + User user = userRepository.findById(userId).orElseThrow(() -> new AuthException(AuthErrorCode.USER_NOT_FOUND)); |
| 100 | + user.resetRefreshToken(); |
52 | 101 | } |
53 | 102 |
|
54 | 103 | @Transactional |
55 | 104 | public void withdraw(long userId) { |
56 | | - authWithdrawService.withdraw(userId); |
| 105 | + User user = userRepository.findById(userId).orElseThrow(() -> new AuthException(AuthErrorCode.USER_NOT_FOUND)); |
| 106 | + userService.deleteUser(user); |
57 | 107 | } |
58 | 108 |
|
59 | 109 | @Transactional |
60 | | - public AccessTokenGetResponseDto reissueToken(String refreshToken) { |
61 | | - AccessTokenGetResponseDto accessTokenGetResponseDto = authReissueService.reissueToken(refreshToken); |
62 | | - return accessTokenGetResponseDto; |
| 110 | + public TokenReissueResponse reissueAccessToken(String authorizationHeader) { |
| 111 | + Long userId = jwtProvider.getUserIdFrom(authorizationHeader); |
| 112 | + |
| 113 | + User user = userRepository.findById(userId) |
| 114 | + .orElseThrow(() -> new JwtException(JwtErrorCode.INVALID_TOKEN)); |
| 115 | + |
| 116 | + String providedToken = jwtProvider.resolveToken(authorizationHeader); |
| 117 | + user.validateRefreshToken(providedToken); |
| 118 | + |
| 119 | + Token accessToken = jwtProvider.generateAccessToken(userId); |
| 120 | + |
| 121 | + |
| 122 | + return new TokenReissueResponse(accessToken.accessToken()); |
63 | 123 | } |
64 | 124 |
|
65 | 125 | @Transactional |
66 | 126 | public void syncUser(long userId, FcmTokenSyncRequest request) { |
67 | | - authSyncUserService.syncUser(userId, request); |
| 127 | + User user = userRepository.findById(userId) |
| 128 | + .orElseThrow(() -> new AuthException(AuthErrorCode.USER_NOT_FOUND)); |
| 129 | + |
| 130 | + notificationUserClient.createOrUpdateUser(user, request.fcmToken()); |
68 | 131 | } |
69 | 132 | } |
0 commit comments