diff --git a/api/src/main/java/com/pinback/api/config/filter/JwtAuthenticationFilter.java b/api/src/main/java/com/pinback/api/config/filter/JwtAuthenticationFilter.java index 4d4b6651..e495529e 100644 --- a/api/src/main/java/com/pinback/api/config/filter/JwtAuthenticationFilter.java +++ b/api/src/main/java/com/pinback/api/config/filter/JwtAuthenticationFilter.java @@ -100,7 +100,8 @@ protected boolean shouldNotFilter(HttpServletRequest request) throws ServletExce path.startsWith("/api/v2/auth/google") || path.startsWith("/oauth/callback") || path.startsWith("/login/google") || - path.startsWith("/login/oauth2/code/google") + path.startsWith("/login/oauth2/code/google") || + path.startsWith("/api/v2/auth/signup") ; } } diff --git a/api/src/main/java/com/pinback/api/config/security/SecurityConfig.java b/api/src/main/java/com/pinback/api/config/security/SecurityConfig.java index 29d67c5f..74f9f400 100644 --- a/api/src/main/java/com/pinback/api/config/security/SecurityConfig.java +++ b/api/src/main/java/com/pinback/api/config/security/SecurityConfig.java @@ -53,7 +53,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers( "/api/v1/auth/token", - "/api/v2/auth/google" + "/api/v2/auth/google", + "/api/v2/auth/signup" ).permitAll() .requestMatchers( diff --git a/api/src/main/java/com/pinback/api/google/controller/GoogleLonginController.java b/api/src/main/java/com/pinback/api/google/controller/GoogleLonginController.java index 3f6c5ae6..f4570119 100644 --- a/api/src/main/java/com/pinback/api/google/controller/GoogleLonginController.java +++ b/api/src/main/java/com/pinback/api/google/controller/GoogleLonginController.java @@ -1,11 +1,15 @@ package com.pinback.api.google.controller; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.pinback.api.auth.dto.request.SignUpRequest; import com.pinback.api.google.dto.request.GoogleLoginRequest; +import com.pinback.application.auth.dto.SignUpResponse; import com.pinback.application.auth.usecase.AuthUsecase; import com.pinback.application.google.dto.response.GoogleLoginResponse; import com.pinback.application.google.usecase.GoogleUsecase; @@ -20,7 +24,7 @@ @Slf4j @RestController -@RequestMapping("/api/v2/auth/google") +@RequestMapping("/api/v2/auth") @RequiredArgsConstructor @Tag(name = "Google", description = "구글 소셜 로그인 API") public class GoogleLonginController { @@ -29,7 +33,7 @@ public class GoogleLonginController { private final AuthUsecase authUsecase; @Operation(summary = "구글 소셜 로그인", description = "구글을 통한 소셜 로그인을 진행합니다") - @PostMapping() + @PostMapping("/google") public Mono> googleLogin( @Valid @RequestBody GoogleLoginRequest request ) { @@ -41,4 +45,13 @@ public Mono> googleLogin( }); }); } + + @Operation(summary = "신규 회원 온보딩", description = "신규 회원의 기본 정보를 등록합니다") + @PatchMapping("/signup") + public ResponseEntity signUpV2( + @Valid @RequestBody SignUpRequest request + ) { + SignUpResponse response = authUsecase.signUpV2(request.toCommand()); + return ResponseEntity.ok(response); + } } diff --git a/application/src/main/java/com/pinback/application/auth/usecase/AuthUsecase.java b/application/src/main/java/com/pinback/application/auth/usecase/AuthUsecase.java index b4609254..def171bd 100644 --- a/application/src/main/java/com/pinback/application/auth/usecase/AuthUsecase.java +++ b/application/src/main/java/com/pinback/application/auth/usecase/AuthUsecase.java @@ -11,6 +11,7 @@ import com.pinback.application.notification.port.in.SavePushSubscriptionPort; import com.pinback.application.user.port.out.UserGetServicePort; import com.pinback.application.user.port.out.UserSaveServicePort; +import com.pinback.application.user.port.out.UserUpdateServicePort; import com.pinback.application.user.port.out.UserValidateServicePort; import com.pinback.domain.user.entity.User; @@ -29,6 +30,7 @@ public class AuthUsecase { private final SavePushSubscriptionPort savePushSubscriptionPort; private final UserGetServicePort userGetServicePort; + private final UserUpdateServicePort userUpdateServicePort; @Transactional public SignUpResponse signUp(SignUpCommand signUpCommand) { @@ -55,14 +57,22 @@ public TokenResponse getToken(String email) { public Mono getInfoAndToken(String email) { return userGetServicePort.findUserByEmail(email) .flatMap(existingUser -> { - log.info("기존 사용자 로그인 성공: User ID {}", existingUser.getId()); - - //Access Token 발급 - String accessToken = jwtProvider.createAccessToken(existingUser.getId()); - - return Mono.just(GoogleLoginResponse.loggedIn( - existingUser.getId(), existingUser.getEmail(), accessToken - )); + if (existingUser.getRemindDefault() != null) { + log.info("기존 사용자 로그인 성공: User ID {}", existingUser.getId()); + + //Access Token 발급 + String accessToken = jwtProvider.createAccessToken(existingUser.getId()); + + return Mono.just(GoogleLoginResponse.loggedIn( + existingUser.getId(), existingUser.getEmail(), accessToken + )); + } else { + log.info("기존 사용자 - 온보딩 미완료 유저 처리: User ID {}", existingUser.getId()); + + return Mono.just(GoogleLoginResponse.tempLogin( + existingUser.getId(), existingUser.getEmail() + )); + } }) .switchIfEmpty(Mono.defer(() -> { log.info("신규 유저 - 임시 유저 생성"); @@ -74,4 +84,15 @@ public Mono getInfoAndToken(String email) { }); })); } + + @Transactional + public SignUpResponse signUpV2(SignUpCommand signUpCommand) { + User user = userGetServicePort.findByEmail(signUpCommand.email()); + String accessToken = jwtProvider.createAccessToken(user.getId()); + userUpdateServicePort.updateRemindDefault(user.getId(), signUpCommand.remindDefault()); + + savePushSubscriptionPort.savePushSubscription(user, signUpCommand.fcmToken()); + + return SignUpResponse.from(accessToken); + } } diff --git a/application/src/main/java/com/pinback/application/user/port/out/UserUpdateServicePort.java b/application/src/main/java/com/pinback/application/user/port/out/UserUpdateServicePort.java new file mode 100644 index 00000000..7a72ad38 --- /dev/null +++ b/application/src/main/java/com/pinback/application/user/port/out/UserUpdateServicePort.java @@ -0,0 +1,8 @@ +package com.pinback.application.user.port.out; + +import java.time.LocalTime; +import java.util.UUID; + +public interface UserUpdateServicePort { + void updateRemindDefault(UUID userId, LocalTime remindDefault); +} diff --git a/infrastructure/src/main/java/com/pinback/infrastructure/user/repository/UserRepository.java b/infrastructure/src/main/java/com/pinback/infrastructure/user/repository/UserRepository.java index 2fcc1282..68fd2a9a 100644 --- a/infrastructure/src/main/java/com/pinback/infrastructure/user/repository/UserRepository.java +++ b/infrastructure/src/main/java/com/pinback/infrastructure/user/repository/UserRepository.java @@ -1,9 +1,13 @@ package com.pinback.infrastructure.user.repository; +import java.time.LocalTime; import java.util.Optional; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import com.pinback.domain.user.entity.User; @@ -12,4 +16,8 @@ public interface UserRepository extends JpaRepository { Optional findByEmail(String email); boolean existsByEmail(String email); + + @Modifying + @Query("UPDATE User u SET u.remindDefault = :newRemindDefault WHERE u.id = :userId") + void updateRemindDefault(@Param("userId") UUID userId, @Param("newRemindDefault") LocalTime newRemindDefault); } diff --git a/infrastructure/src/main/java/com/pinback/infrastructure/user/service/UserUpdateService.java b/infrastructure/src/main/java/com/pinback/infrastructure/user/service/UserUpdateService.java new file mode 100644 index 00000000..76c604c7 --- /dev/null +++ b/infrastructure/src/main/java/com/pinback/infrastructure/user/service/UserUpdateService.java @@ -0,0 +1,24 @@ +package com.pinback.infrastructure.user.service; + +import java.time.LocalTime; +import java.util.UUID; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.pinback.application.user.port.out.UserUpdateServicePort; +import com.pinback.infrastructure.user.repository.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional +public class UserUpdateService implements UserUpdateServicePort { + private final UserRepository userRepository; + + @Override + public void updateRemindDefault(UUID userId, LocalTime remindDefault) { + userRepository.updateRemindDefault(userId, remindDefault); + } +} diff --git a/src/main/resources/static/login.html b/src/main/resources/static/login.html deleted file mode 100644 index 388d449a..00000000 --- a/src/main/resources/static/login.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 로그인 - - - - - - - - \ No newline at end of file