From cb728f8c59cc765de4f50be68eef90f8d12ea191 Mon Sep 17 00:00:00 2001 From: ose0221 Date: Fri, 21 Nov 2025 02:27:51 +0900 Subject: [PATCH 1/3] =?UTF-8?q?FEAT:=20=EC=86=8C=EC=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20test=20static=20file=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/login.html | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/main/resources/static/login.html diff --git a/src/main/resources/static/login.html b/src/main/resources/static/login.html deleted file mode 100644 index 388d449..0000000 --- a/src/main/resources/static/login.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 로그인 - - - - - - - - \ No newline at end of file From 932043da690cc65339af4d9cd060589a5e94852b Mon Sep 17 00:00:00 2001 From: ose0221 Date: Fri, 21 Nov 2025 02:29:17 +0900 Subject: [PATCH 2/3] =?UTF-8?q?FEAT:=20=EC=86=8C=EC=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B8=B0=EC=A1=B4=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=A7=88=EC=9D=B8=EB=93=9C=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/auth/usecase/AuthUsecase.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) 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 b460925..1e5dc69 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("신규 유저 - 임시 유저 생성"); From 7992f77c164cc6ceb4b8f8ed2b1857ccbeac4d37 Mon Sep 17 00:00:00 2001 From: ose0221 Date: Fri, 21 Nov 2025 02:31:15 +0900 Subject: [PATCH 3/3] =?UTF-8?q?FEAT:=20=EC=98=A8=EB=B3=B4=EB=94=A9=20api?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/JwtAuthenticationFilter.java | 3 ++- .../api/config/security/SecurityConfig.java | 3 ++- .../controller/GoogleLonginController.java | 17 +++++++++++-- .../application/auth/usecase/AuthUsecase.java | 11 +++++++++ .../user/port/out/UserUpdateServicePort.java | 8 +++++++ .../user/repository/UserRepository.java | 8 +++++++ .../user/service/UserUpdateService.java | 24 +++++++++++++++++++ 7 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 application/src/main/java/com/pinback/application/user/port/out/UserUpdateServicePort.java create mode 100644 infrastructure/src/main/java/com/pinback/infrastructure/user/service/UserUpdateService.java 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 4d4b665..e495529 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 29d67c5..74f9f40 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 3f6c5ae..f457011 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 1e5dc69..def171b 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 @@ -84,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 0000000..7a72ad3 --- /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 2fcc128..68fd2a9 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 0000000..76c604c --- /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); + } +}