diff --git a/src/main/java/com/gcms/v3/domain/auth/domain/entity/RefreshToken.java b/src/main/java/com/gcms/v3/domain/auth/domain/entity/RefreshToken.java index beba913..abf97a0 100644 --- a/src/main/java/com/gcms/v3/domain/auth/domain/entity/RefreshToken.java +++ b/src/main/java/com/gcms/v3/domain/auth/domain/entity/RefreshToken.java @@ -11,10 +11,10 @@ @RedisHash(value = "refreshToken", timeToLive = 60L * 60 * 24 * 7) public class RefreshToken { + @Id @Indexed private String email; - @Id @Indexed private String token; } diff --git a/src/main/java/com/gcms/v3/domain/auth/presentation/AuthController.java b/src/main/java/com/gcms/v3/domain/auth/presentation/AuthController.java index 1bcd88d..ce5359e 100644 --- a/src/main/java/com/gcms/v3/domain/auth/presentation/AuthController.java +++ b/src/main/java/com/gcms/v3/domain/auth/presentation/AuthController.java @@ -2,6 +2,7 @@ import com.gcms.v3.domain.auth.presentation.data.request.SignInRequestDto; import com.gcms.v3.domain.auth.presentation.data.response.TokenInfoResponseDto; +import com.gcms.v3.domain.auth.service.CancelMembershipService; import com.gcms.v3.domain.auth.service.LogoutService; import com.gcms.v3.domain.auth.service.ReissueTokenService; import com.gcms.v3.domain.auth.service.SignInService; @@ -12,12 +13,13 @@ @RequiredArgsConstructor @RestController -@RequestMapping("/v3/auth") +@RequestMapping("/auth") public class AuthController { private final SignInService signInService; private final ReissueTokenService reissueTokenService; private final LogoutService logoutService; + private final CancelMembershipService cancelMembershipService; @PostMapping public ResponseEntity signIn (@RequestBody SignInRequestDto signInRequestDto) { @@ -32,8 +34,14 @@ public ResponseEntity reissueToken (@RequestBody String re } @DeleteMapping("/logout") - public ResponseEntity logout(HttpServletRequest request) { + public ResponseEntity logout (HttpServletRequest request) { logoutService.execute(request); return ResponseEntity.noContent().build(); } + + @DeleteMapping + public ResponseEntity cancelMembership () { + cancelMembershipService.execute(); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/gcms/v3/domain/auth/service/CancelMembershipService.java b/src/main/java/com/gcms/v3/domain/auth/service/CancelMembershipService.java new file mode 100644 index 0000000..3378bcd --- /dev/null +++ b/src/main/java/com/gcms/v3/domain/auth/service/CancelMembershipService.java @@ -0,0 +1,5 @@ +package com.gcms.v3.domain.auth.service; + +public interface CancelMembershipService { + void execute(); +} diff --git a/src/main/java/com/gcms/v3/domain/auth/service/impl/CancelMembershipServiceImpl.java b/src/main/java/com/gcms/v3/domain/auth/service/impl/CancelMembershipServiceImpl.java new file mode 100644 index 0000000..1a2c32a --- /dev/null +++ b/src/main/java/com/gcms/v3/domain/auth/service/impl/CancelMembershipServiceImpl.java @@ -0,0 +1,31 @@ +package com.gcms.v3.domain.auth.service.impl; + +import com.gcms.v3.domain.auth.domain.repository.RefreshTokenRepository; +import com.gcms.v3.domain.auth.service.CancelMembershipService; +import com.gcms.v3.domain.user.domain.entity.User; +import com.gcms.v3.domain.user.domain.repository.UserRepository; +import com.gcms.v3.domain.user.domain.repository.UserRoleRepository; +import com.gcms.v3.domain.user.util.UserUtil; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Transactional +public class CancelMembershipServiceImpl implements CancelMembershipService { + + private final UserUtil userUtil; + private final UserRepository userRepository; + private final UserRoleRepository userRoleRepository; + private final RefreshTokenRepository refreshTokenRepository; + + public void execute() { + User user = userUtil.getCurrentUser(); + + refreshTokenRepository.deleteById(user.getEmail()); + + userRoleRepository.deleteByUser(user); + userRepository.deleteById(user.getId()); + } +} diff --git a/src/main/java/com/gcms/v3/domain/auth/service/impl/SignInServiceImpl.java b/src/main/java/com/gcms/v3/domain/auth/service/impl/SignInServiceImpl.java index b350f99..842e04f 100644 --- a/src/main/java/com/gcms/v3/domain/auth/service/impl/SignInServiceImpl.java +++ b/src/main/java/com/gcms/v3/domain/auth/service/impl/SignInServiceImpl.java @@ -18,7 +18,6 @@ import org.springframework.stereotype.Service; @Service -@Transactional(rollbackOn = Exception.class) @RequiredArgsConstructor public class SignInServiceImpl implements SignInService { diff --git a/src/main/java/com/gcms/v3/domain/user/domain/repository/UserRoleRepository.java b/src/main/java/com/gcms/v3/domain/user/domain/repository/UserRoleRepository.java index cf16d5e..1b45bab 100644 --- a/src/main/java/com/gcms/v3/domain/user/domain/repository/UserRoleRepository.java +++ b/src/main/java/com/gcms/v3/domain/user/domain/repository/UserRoleRepository.java @@ -8,4 +8,6 @@ public interface UserRoleRepository extends JpaRepository { List findByUser(User user); + + void deleteByUser(User user); } diff --git a/src/main/java/com/gcms/v3/global/security/config/SecurityConfig.java b/src/main/java/com/gcms/v3/global/security/config/SecurityConfig.java index 21ef9a4..c1ee41e 100644 --- a/src/main/java/com/gcms/v3/global/security/config/SecurityConfig.java +++ b/src/main/java/com/gcms/v3/global/security/config/SecurityConfig.java @@ -42,9 +42,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests((authorizeRequests) -> authorizeRequests - .requestMatchers(HttpMethod.POST, "/v3/auth").permitAll() - .requestMatchers(HttpMethod.POST, "/v3/auth/reissueToken").authenticated() - .requestMatchers(HttpMethod.DELETE, "/v3/auth/logout").authenticated() + .requestMatchers(HttpMethod.POST, "/auth").permitAll() + .requestMatchers(HttpMethod.POST, "/auth/reissueToken").permitAll() + .requestMatchers(HttpMethod.DELETE, "/auth/logout").authenticated() + .requestMatchers(HttpMethod.DELETE, "/auth").authenticated() ) .addFilterBefore(new ExceptionFilter(objectMapper), UsernamePasswordAuthenticationFilter.class)