diff --git a/src/main/java/org/terning/terningserver/auth/api/AuthController.java b/src/main/java/org/terning/terningserver/auth/api/AuthController.java index 81b92c8..7424494 100644 --- a/src/main/java/org/terning/terningserver/auth/api/AuthController.java +++ b/src/main/java/org/terning/terningserver/auth/api/AuthController.java @@ -6,6 +6,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.terning.terningserver.auth.application.AuthService; +import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; import org.terning.terningserver.auth.dto.request.SignInRequest; import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto; import org.terning.terningserver.auth.dto.request.SignUpRequestDto; @@ -19,6 +20,7 @@ import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_OUT; import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP; import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_SIGN_UP_FILTER; +import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_USER_SYNC; import static org.terning.terningserver.common.exception.enums.SuccessMessage.SUCCESS_WITHDRAW; @@ -78,4 +80,13 @@ public ResponseEntity withdraw(@AuthenticationPrincipal Long us return ResponseEntity.ok(SuccessResponse.of(SUCCESS_WITHDRAW)); } + + @PostMapping("/sync-user") + public ResponseEntity syncUser( + @AuthenticationPrincipal Long userId, + @RequestBody FcmTokenSyncRequest request + ) { + authService.syncUser(userId, request); + return ResponseEntity.ok(SuccessResponse.of(SUCCESS_USER_SYNC)); + } } diff --git a/src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java b/src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java index 104f1e3..7151626 100644 --- a/src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java +++ b/src/main/java/org/terning/terningserver/auth/api/AuthSwagger.java @@ -7,6 +7,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; +import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; import org.terning.terningserver.auth.dto.request.SignInRequest; import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto; import org.terning.terningserver.auth.dto.request.SignUpRequestDto; @@ -52,4 +53,10 @@ ResponseEntity signOut( @Operation(summary = "계정탈퇴", description = "계정탈퇴 API") ResponseEntity withdraw( @AuthenticationPrincipal Long userId); + + @Operation(summary = "유저동기화", description = "유저동기화 API") + ResponseEntity syncUser( + @AuthenticationPrincipal Long userId, + @RequestBody FcmTokenSyncRequest request + ); } diff --git a/src/main/java/org/terning/terningserver/auth/application/AuthService.java b/src/main/java/org/terning/terningserver/auth/application/AuthService.java index 6e4d5c8..58a3326 100644 --- a/src/main/java/org/terning/terningserver/auth/application/AuthService.java +++ b/src/main/java/org/terning/terningserver/auth/application/AuthService.java @@ -7,7 +7,9 @@ import org.terning.terningserver.auth.application.signin.AuthSignInService; import org.terning.terningserver.auth.application.signout.AuthSignOutService; import org.terning.terningserver.auth.application.signup.AuthSignUpService; +import org.terning.terningserver.auth.application.syncUser.AuthSyncUserService; import org.terning.terningserver.auth.application.withdraw.AuthWithdrawService; +import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; import org.terning.terningserver.auth.dto.request.SignInRequest; import org.terning.terningserver.auth.dto.request.SignUpFilterRequestDto; import org.terning.terningserver.auth.dto.request.SignUpRequestDto; @@ -25,6 +27,7 @@ public class AuthService { private final AuthSignOutService authSignOutService; private final AuthWithdrawService authWithdrawService; private final AuthReissueService authReissueService; + private final AuthSyncUserService authSyncUserService; @Transactional public SignInResponse signIn(String authAccessToken, SignInRequest request) { @@ -58,4 +61,9 @@ public AccessTokenGetResponseDto reissueToken(String refreshToken) { AccessTokenGetResponseDto accessTokenGetResponseDto = authReissueService.reissueToken(refreshToken); return accessTokenGetResponseDto; } + + @Transactional + public void syncUser(long userId, FcmTokenSyncRequest request) { + authSyncUserService.syncUser(userId, request); + } } diff --git a/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserService.java b/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserService.java new file mode 100644 index 0000000..205dee8 --- /dev/null +++ b/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserService.java @@ -0,0 +1,8 @@ +package org.terning.terningserver.auth.application.syncUser; + +import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; + +public interface AuthSyncUserService { + + void syncUser(long userId, FcmTokenSyncRequest request); +} diff --git a/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserServiceImpl.java b/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserServiceImpl.java new file mode 100644 index 0000000..731d5f0 --- /dev/null +++ b/src/main/java/org/terning/terningserver/auth/application/syncUser/AuthSyncUserServiceImpl.java @@ -0,0 +1,29 @@ +package org.terning.terningserver.auth.application.syncUser; + +import static org.terning.terningserver.common.exception.enums.ErrorMessage.NOT_FOUND_USER_EXCEPTION; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.terning.terningserver.auth.dto.request.FcmTokenSyncRequest; +import org.terning.terningserver.common.exception.CustomException; +import org.terning.terningserver.external.pushNotification.notification.NotificationUserClient; +import org.terning.terningserver.user.domain.User; +import org.terning.terningserver.user.repository.UserRepository; + +@Service +@RequiredArgsConstructor +public class AuthSyncUserServiceImpl implements AuthSyncUserService { + + private final UserRepository userRepository; + private final NotificationUserClient notificationUserClient; + + @Transactional + @Override + public void syncUser(long userId, FcmTokenSyncRequest request) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new CustomException(NOT_FOUND_USER_EXCEPTION)); + + notificationUserClient.createOrUpdateUser(user, request.fcmToken()); + } +} diff --git a/src/main/java/org/terning/terningserver/auth/dto/request/FcmTokenSyncRequest.java b/src/main/java/org/terning/terningserver/auth/dto/request/FcmTokenSyncRequest.java new file mode 100644 index 0000000..205841c --- /dev/null +++ b/src/main/java/org/terning/terningserver/auth/dto/request/FcmTokenSyncRequest.java @@ -0,0 +1,6 @@ +package org.terning.terningserver.auth.dto.request; + +public record FcmTokenSyncRequest( + String fcmToken +) { +} diff --git a/src/main/java/org/terning/terningserver/common/config/SecurityConfig.java b/src/main/java/org/terning/terningserver/common/config/SecurityConfig.java index 2ef391b..f984b4f 100644 --- a/src/main/java/org/terning/terningserver/common/config/SecurityConfig.java +++ b/src/main/java/org/terning/terningserver/common/config/SecurityConfig.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; @@ -15,6 +16,7 @@ @Configuration @EnableWebSecurity @RequiredArgsConstructor +@EnableMethodSecurity public class SecurityConfig { private final JwtAuthenticationFilter jwtAuthenticationFilter; diff --git a/src/main/java/org/terning/terningserver/common/exception/enums/SuccessMessage.java b/src/main/java/org/terning/terningserver/common/exception/enums/SuccessMessage.java index bf5c98b..f762f48 100644 --- a/src/main/java/org/terning/terningserver/common/exception/enums/SuccessMessage.java +++ b/src/main/java/org/terning/terningserver/common/exception/enums/SuccessMessage.java @@ -55,8 +55,10 @@ public enum SuccessMessage { // My page (마이페이지 화면) SUCCESS_GET_PROFILE(200, "마이페이지 > 프로필 정보 불러오기를 성공했습니다"), SUCCESS_UPDATE_PROFILE(200, "프로필 수정에 성공했습니다"), - PUSH_STATUS_UPDATED(200, "사용자 푸시알림 여부 변경을 완료했습니다."); + PUSH_STATUS_UPDATED(200, "사용자 푸시알림 여부 변경을 완료했습니다."), + // 유저 동기화 + SUCCESS_USER_SYNC(201, "유저 동기화를 성공했습니다."); private final int status; private final String message;