diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index 3b2005c4..74b5830f 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -18,12 +18,6 @@ jobs: with: java-version: 17 distribution: 'zulu' - - name: Cache SonarCloud packages - uses: actions/cache@v3 - with: - path: ~/.sonar/cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - name: Gradle Caching uses: actions/cache@v3 with: @@ -36,8 +30,7 @@ jobs: - name: Build and analyze env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: ./gradlew test testCodeCoverageReport sonar --info + run: ./gradlew build - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v1 diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationNumberDao.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationNumberRepository.java similarity index 57% rename from core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationNumberDao.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationNumberRepository.java index 8716e037..b5c2614f 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationNumberDao.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationNumberRepository.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.auth.certification; +package cmc.mellyserver.auth.certificate; import static cmc.mellyserver.mail.EmailConstants.*; @@ -11,17 +11,14 @@ @Repository @RequiredArgsConstructor -class EmailCertificationNumberDao implements CertificationNumberDao { +class CertificationNumberRepository { private final StringRedisTemplate redisTemplate; - /** - * 이메일 인증 번호를 Redis에 저장합니다. - *

- * 인증번호 유효기간은 3분으로 설정했습니다. + /* + 인증번호 유효기간 : 3분 */ - @Override - public void saveCertificationNumber(String email, String certificationNumber) { + public void save(String email, String certificationNumber) { redisTemplate.opsForValue() .set(PREFIX_CERTIFICATION + email, certificationNumber, @@ -29,18 +26,15 @@ public void saveCertificationNumber(String email, String certificationNumber) { } - @Override - public String getCertificationNumber(String email) { + public String get(String email) { return redisTemplate.opsForValue().get(PREFIX_CERTIFICATION + email); } - @Override - public void removeCertificationNumber(String email) { + public void remove(String email) { redisTemplate.delete(PREFIX_CERTIFICATION + email); } - @Override - public boolean hasKey(String email) { + public Boolean hasKey(String email) { return redisTemplate.hasKey(PREFIX_CERTIFICATION + email); } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationService.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationService.java similarity index 56% rename from core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationService.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationService.java index 13f8977a..4edb7958 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationService.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/CertificationService.java @@ -1,4 +1,6 @@ -package cmc.mellyserver.auth.certification; +package cmc.mellyserver.auth.certificate; + +import cmc.mellyserver.auth.dto.request.EmailCertificationRequest; public interface CertificationService { diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationService.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/EmailCertificationService.java similarity index 59% rename from core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationService.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/certificate/EmailCertificationService.java index 943589be..9ba5fbb6 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationService.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/EmailCertificationService.java @@ -1,20 +1,21 @@ -package cmc.mellyserver.auth.certification; +package cmc.mellyserver.auth.certificate; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; -import cmc.mellyserver.common.event.SignupCertificationEvent; +import cmc.mellyserver.auth.dto.request.EmailCertificationRequest; +import cmc.mellyserver.common.event.CertificationCompletedEvent; import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor @Profile({"local", "prod"}) @Repository +@RequiredArgsConstructor class EmailCertificationService implements CertificationService { - private final ApplicationEventPublisher applicationEventPublisher; + private final CertificationNumberRepository certificationNumberRepository; - private final CertificationNumberDao certificationNumberDao; + private final ApplicationEventPublisher applicationEventPublisher; /** * 인증 이메일 전송 기능 @@ -22,9 +23,9 @@ class EmailCertificationService implements CertificationService { public void sendCertification(String email) { String certificationNumber = RandomNumberGenerator.makeRandomNumber(); + certificationNumberRepository.save(email, certificationNumber); + applicationEventPublisher.publishEvent(new CertificationCompletedEvent(email, certificationNumber)); - applicationEventPublisher.publishEvent(new SignupCertificationEvent(email, certificationNumber)); - certificationNumberDao.saveCertificationNumber(email, certificationNumber); } // 인증번호 일치 여부 확인 @@ -35,14 +36,14 @@ public void verify(EmailCertificationRequest requestDto) { } // 인증 후 DB에서 인증번호 삭제 - certificationNumberDao.removeCertificationNumber(requestDto.getEmail()); + certificationNumberRepository.remove(requestDto.email()); } // 인증번호 일치 여부 확인 내부 로직 private boolean isVerify(EmailCertificationRequest requestDto) { - return !(certificationNumberDao.hasKey(requestDto.getEmail()) - && certificationNumberDao.getCertificationNumber(requestDto.getEmail()) - .equals(requestDto.getCertificationNumber())); + return !(certificationNumberRepository.hasKey(requestDto.email()) + && certificationNumberRepository.get(requestDto.email()) + .equals(requestDto.certificationNumber())); } } \ No newline at end of file diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/RandomNumberGenerator.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/RandomNumberGenerator.java similarity index 86% rename from core/core-api/src/main/java/cmc/mellyserver/auth/certification/RandomNumberGenerator.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/certificate/RandomNumberGenerator.java index c2fed3a6..99f36df9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/RandomNumberGenerator.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/certificate/RandomNumberGenerator.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.auth.certification; +package cmc.mellyserver.auth.certificate; import java.util.Random; diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationNumberDao.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationNumberDao.java deleted file mode 100644 index 9cbfb8c7..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/CertificationNumberDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package cmc.mellyserver.auth.certification; - -public interface CertificationNumberDao { - - void saveCertificationNumber(String email, String certificationNumber); - - String getCertificationNumber(String email); - - void removeCertificationNumber(String email); - - boolean hasKey(String email); - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationRequest.java deleted file mode 100644 index 29fa386e..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/certification/EmailCertificationRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package cmc.mellyserver.auth.certification; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class EmailCertificationRequest { - - private String email; - - private String certificationNumber; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/JwtExceptionFilter.java b/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/JwtExceptionFilter.java index d7a209d4..820f21b9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/JwtExceptionFilter.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/JwtExceptionFilter.java @@ -3,6 +3,7 @@ import java.io.IOException; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -24,40 +25,34 @@ public class JwtExceptionFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { try { - chain.doFilter(request, response); - } catch (JwtException ex) { - - setExpiredErrorResponse(request, response, ex); - + setExpiredErrorResponse(response); } catch (LogoutOrWithdrawException ex) { - setLogoutOrWithdrawErrorResponse(request, response, ex); + setLogoutOrWithdrawErrorResponse(response); } } - public void setExpiredErrorResponse(HttpServletRequest request, HttpServletResponse response, Throwable ex) - throws IOException { + private void setExpiredErrorResponse(HttpServletResponse response) throws IOException { - response.setContentType("application/json; charset=UTF-8"); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.OK.value()); ErrorResponse error = ErrorResponse.of(ErrorCode.EXPIRED_TOKEN); - final ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(response.getOutputStream(), error); } - public void setLogoutOrWithdrawErrorResponse(HttpServletRequest request, HttpServletResponse response, Throwable ex) - throws IOException { + private void setLogoutOrWithdrawErrorResponse(HttpServletResponse response) throws IOException { - response.setContentType("application/json; charset=UTF-8"); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.OK.value()); ErrorResponse error = ErrorResponse.of(ErrorCode.LOGOUT_WITHDRAW_USER); - final ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(response.getOutputStream(), error); } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/TokenAuthenticationFilter.java b/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/TokenAuthenticationFilter.java index ad6e1e15..bfde8188 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/TokenAuthenticationFilter.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/common/filter/TokenAuthenticationFilter.java @@ -46,12 +46,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse filterChain.doFilter(request, response); } - private void checkLogoutOrWithdrawUser(String jwt) { + private void checkLogoutOrWithdrawUser(String accessToken) { ValueOperations valueOperations = redisTemplate.opsForValue(); - if (!Objects.isNull(valueOperations.get(jwt))) { - throw new LogoutOrWithdrawException("이미 로그아웃하거나 탈퇴한 유저 입니다."); + if (Objects.nonNull(valueOperations.get(accessToken))) { + throw new LogoutOrWithdrawException("already Logout or withdraw user"); } } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/CurrentUser.java b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/CurrentUser.java similarity index 83% rename from core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/CurrentUser.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/CurrentUser.java index e55bde51..f10a09ec 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/CurrentUser.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/CurrentUser.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.auth.controller.dto.common; +package cmc.mellyserver.auth.common.resolver; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUser.java b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUser.java new file mode 100644 index 00000000..c77c2edb --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUser.java @@ -0,0 +1,15 @@ +package cmc.mellyserver.auth.common.resolver; + +public class LoginUser { + + private final Long userId; + + public LoginUser(Long userId) { + this.userId = userId; + } + + public Long getId() { + return userId; + } + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/common/resolver/LoginUserIdArgumentResolver.java b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUserIdArgumentResolver.java similarity index 83% rename from core/core-api/src/main/java/cmc/mellyserver/common/resolver/LoginUserIdArgumentResolver.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUserIdArgumentResolver.java index 01f57a67..8658bd00 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/common/resolver/LoginUserIdArgumentResolver.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/common/resolver/LoginUserIdArgumentResolver.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.common.resolver; +package cmc.mellyserver.auth.common.resolver; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; @@ -7,8 +7,6 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; import cmc.mellyserver.auth.token.TokenProvider; import cmc.mellyserver.common.util.HeaderUtil; import jakarta.servlet.http.HttpServletRequest; @@ -34,8 +32,8 @@ public Object resolveArgument(final MethodParameter parameter, final ModelAndVie HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); String accessToken = HeaderUtil.getAccessToken(request); - Long id = tokenProvider.extractUserId(accessToken); - return new LoginUser(id); + Long userId = tokenProvider.extractUserId(accessToken); + return new LoginUser(userId); } } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/config/RedisConstants.java b/core/core-api/src/main/java/cmc/mellyserver/auth/config/RedisConstants.java deleted file mode 100644 index a5574495..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/config/RedisConstants.java +++ /dev/null @@ -1,9 +0,0 @@ -package cmc.mellyserver.auth.config; - -public abstract class RedisConstants { - - public static final String REFRESH_TOKEN_PREFIX = "rft:user-id:"; - - public static final String ACCESS_TOKEN_BLACKLIST = "blackList"; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/AuthController.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/AuthController.java index 1e8aef13..b39f9996 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/AuthController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/AuthController.java @@ -10,29 +10,27 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.AuthService; -import cmc.mellyserver.auth.OAuthService; -import cmc.mellyserver.auth.certification.CertificationService; -import cmc.mellyserver.auth.certification.EmailCertificationRequest; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.certificate.CertificationService; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.auth.controller.dto.request.AuthLoginRequest; -import cmc.mellyserver.auth.controller.dto.request.CommonSignupRequest; +import cmc.mellyserver.auth.controller.dto.request.ChangePasswordRequest; import cmc.mellyserver.auth.controller.dto.request.OAuthLoginRequest; import cmc.mellyserver.auth.controller.dto.request.OAuthSignupRequest; import cmc.mellyserver.auth.controller.dto.request.ReIssueAccessTokenRequest; -import cmc.mellyserver.auth.controller.dto.response.OAuthResponseDto; -import cmc.mellyserver.auth.dto.request.ChangePasswordRequest; +import cmc.mellyserver.auth.controller.dto.request.SignupRequest; +import cmc.mellyserver.auth.dto.request.EmailCertificationRequest; +import cmc.mellyserver.auth.dto.response.OAuthResponseDto; import cmc.mellyserver.auth.dto.response.TokenResponseDto; +import cmc.mellyserver.auth.service.AuthService; +import cmc.mellyserver.auth.service.OAuthService; import cmc.mellyserver.common.util.HeaderUtil; import cmc.mellyserver.support.response.ApiResponse; import cmc.mellyserver.support.response.SuccessCode; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -@Slf4j @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor @@ -63,7 +61,7 @@ public ResponseEntity> socialSignup( // 이메일 회원 가입 @PostMapping("/signup") - public ResponseEntity> signup(@Valid CommonSignupRequest commonSignupRequest) { + public ResponseEntity> signup(@Valid SignupRequest commonSignupRequest) { TokenResponseDto signupToken = authService.signup(commonSignupRequest.toDto()); return ApiResponse.success(SuccessCode.INSERT_SUCCESS, signupToken); @@ -81,7 +79,7 @@ public ResponseEntity> login(@Valid @RequestBody A @PostMapping("/email-certification/sends") public ResponseEntity> sendEmailCertification(@RequestBody EmailCertificationRequest requestDto) { - certificationService.sendCertification(requestDto.getEmail()); + certificationService.sendCertification(requestDto.email()); return ApiResponse.success(SuccessCode.INSERT_SUCCESS); } @@ -90,7 +88,7 @@ public ResponseEntity> sendEmailCertification(@RequestBody Ema public ResponseEntity> resendEmailCertification( @RequestBody EmailCertificationRequest requestDto) { - certificationService.sendCertification(requestDto.getEmail()); + certificationService.sendCertification(requestDto.email()); return ApiResponse.success(SuccessCode.INSERT_SUCCESS); } @@ -153,7 +151,7 @@ public ResponseEntity> generateAccessToken( @RequestBody ReIssueAccessTokenRequest reIssueAccessTokenRequest) { TokenResponseDto tokenResponseDto = authService - .reIssueAccessTokenAndRefreshToken(reIssueAccessTokenRequest.getRefreshToken()); + .reIssueAccessTokenAndRefreshToken(reIssueAccessTokenRequest.refreshToken()); return ApiResponse.success(SuccessCode.INSERT_SUCCESS, tokenResponseDto); } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/AuthmeWrappingDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/AuthmeWrappingDto.java deleted file mode 100644 index 2c984654..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/AuthmeWrappingDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.common; - -import cmc.mellyserver.auth.controller.dto.response.AccessTokenUserData; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AuthmeWrappingDto { - - private AccessTokenUserData user; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/LoginUser.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/LoginUser.java deleted file mode 100644 index 712d094c..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/LoginUser.java +++ /dev/null @@ -1,18 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.common; - -public class LoginUser { - - private Long id; - - private LoginUser() { - } - - public LoginUser(final Long id) { - this.id = id; - } - - public Long getId() { - return id; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/UserDataWrappingDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/UserDataWrappingDto.java deleted file mode 100644 index 36ab6e46..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/common/UserDataWrappingDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.common; - -import cmc.mellyserver.auth.controller.dto.response.AccessTokenUserData; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -public class UserDataWrappingDto { - - private AccessTokenUserData user; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthLoginRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthLoginRequest.java index f25f03f2..9b99affa 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthLoginRequest.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthLoginRequest.java @@ -2,24 +2,15 @@ import cmc.mellyserver.auth.dto.request.AuthLoginRequestDto; import jakarta.validation.constraints.Email; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class AuthLoginRequest { +public record AuthLoginRequest( @Email(message = "이메일 형식을 지켜야 합니다") - private String email; - - private String password; + String email, - private String fcmToken; + String password, - public AuthLoginRequest(String email, String password) { - this.email = email; - this.password = password; - } + String fcmToken +) { public AuthLoginRequestDto toDto() { return new AuthLoginRequestDto(email, password, fcmToken); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForOAuthSignup.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForOAuthSignup.java deleted file mode 100644 index 95ed8f7f..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForOAuthSignup.java +++ /dev/null @@ -1,31 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import org.springframework.lang.Nullable; -import org.springframework.web.multipart.MultipartFile; - -import cmc.mellyserver.dbcore.user.enums.AgeGroup; -import cmc.mellyserver.dbcore.user.enums.Gender; -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AuthRequestForOAuthSignup { - - private String uid; - - private String nickname; - - private Gender gender; - - @Nullable - private MultipartFile profileImage; - - @Nullable - private AgeGroup ageGroup; - - @Nullable - private String fcmToken; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForSignup.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForSignup.java deleted file mode 100644 index 7e7e35d6..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/AuthRequestForSignup.java +++ /dev/null @@ -1,50 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import org.springframework.lang.Nullable; -import org.springframework.web.multipart.MultipartFile; - -import cmc.mellyserver.dbcore.user.enums.AgeGroup; -import cmc.mellyserver.dbcore.user.enums.Gender; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.Size; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AuthRequestForSignup { - - @Email(message = "이메일 형식이 올바르지 않습니다.") // ok - private String email; - - @Size(min = 8, message = "비밀번호는 8자 이상 입력해주세요.") // ok - private String password; - - @Size(min = 2, max = 8, message = "닉네임은 2자 이상 8자 이하로 입력해주세요.") // ok - private String nickname; - - private Gender gender; - - @Nullable - private MultipartFile profileImage; - - @Nullable - private AgeGroup ageGroup; - - private String fcmToken; - - @Builder - public AuthRequestForSignup(String email, String password, String nickname, Gender gender, - @Nullable MultipartFile profileImage, @Nullable AgeGroup ageGroup, String fcmToken) { - this.email = email; - this.password = password; - this.nickname = nickname; - this.gender = gender; - this.profileImage = profileImage; - this.ageGroup = ageGroup; - this.fcmToken = fcmToken; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ChangePasswordRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ChangePasswordRequest.java new file mode 100644 index 00000000..8f9cd1e8 --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ChangePasswordRequest.java @@ -0,0 +1,19 @@ +package cmc.mellyserver.auth.controller.dto.request; + +import jakarta.validation.constraints.Pattern; +import lombok.Builder; + +public record ChangePasswordRequest( + + String email, + + @Pattern(regexp = "^(?=.*\\d)(?=.*[a-zA-Z])[0-9a-zA-Z]{8,}", message = "비밀번호는 영문과 숫자 조합으로 8자리 이상 가능합니다.") + String passwordAfter, + + String passwordBefore + +) { + @Builder + public ChangePasswordRequest { + } +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateEmailRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateEmailRequest.java deleted file mode 100644 index 23460148..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateEmailRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CheckDuplicateEmailRequest { - - private String email; - - public CheckDuplicateEmailRequest(String email) { - this.email = email; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateNicknameRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateNicknameRequest.java deleted file mode 100644 index 563e7b10..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CheckDuplicateNicknameRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CheckDuplicateNicknameRequest { - - private String nickname; - - public CheckDuplicateNicknameRequest(String nickname) { - this.nickname = nickname; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/LogoutRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/LogoutRequest.java deleted file mode 100644 index 5705ae08..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/LogoutRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Data -public class LogoutRequest { - - private String accessToken; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthLoginRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthLoginRequest.java index 304b3e27..c3426afd 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthLoginRequest.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthLoginRequest.java @@ -2,30 +2,15 @@ import cmc.mellyserver.auth.dto.request.OAuthLoginRequestDto; import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AccessLevel; import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class OAuthLoginRequest { - - private String accessToken; // 리소스 서버 접근용 액세스 토큰 - - private Provider provider; // 제공자 - - private String fcmToken; // FCM 토큰 +public record OAuthLoginRequest(String accessToken, Provider provider, String fcmToken) { @Builder - public OAuthLoginRequest(String accessToken, Provider provider, String fcmToken) { - this.accessToken = accessToken; - this.provider = provider; - this.fcmToken = fcmToken; + public OAuthLoginRequest { } public OAuthLoginRequestDto toDto() { return OAuthLoginRequestDto.builder().accessToken(accessToken).fcmToken(fcmToken).provider(provider).build(); } - } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequest.java index 6b5f1f73..576b9fc9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequest.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequest.java @@ -2,33 +2,27 @@ import org.hibernate.validator.constraints.Length; +import cmc.mellyserver.auth.dto.request.OAuthSignupRequestDto; import cmc.mellyserver.dbcore.user.enums.AgeGroup; import cmc.mellyserver.dbcore.user.enums.Gender; import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class OAuthSignupRequest { +public record OAuthSignupRequest( + String email, - // Oauth를 통해 넘겨받은 정보 - private String email; + String socialId, - private String socialId; + Provider provider, - private Provider provider; - - // 입력 정보 @Length(min = 2, max = 15, message = "닉네임은 2자 이상 15자 이하로 작성해주세요.") - private String nickname; // 닉네임 + String nickname, - private Gender gender; // 성별 + Gender gender, - private AgeGroup ageGroup; // 연령대 + AgeGroup ageGroup, - private String fcmToken; + String fcmToken +) { public OAuthSignupRequestDto toDto() { return new OAuthSignupRequestDto(email, socialId, provider, nickname, gender, ageGroup, fcmToken); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequestDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequestDto.java deleted file mode 100644 index eb2a5aaa..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/OAuthSignupRequestDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.request; - -import cmc.mellyserver.dbcore.user.User; -import cmc.mellyserver.dbcore.user.enums.AgeGroup; -import cmc.mellyserver.dbcore.user.enums.Gender; -import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class OAuthSignupRequestDto { - - private String email; - - private String socialId; - - private Provider provider; - - private String nickname; - - private Gender gender; - - private AgeGroup ageGroup; - - private String fcmToken; - - public User toEntity() { - return null; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ReIssueAccessTokenRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ReIssueAccessTokenRequest.java index 97f72afd..35f2b935 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ReIssueAccessTokenRequest.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/ReIssueAccessTokenRequest.java @@ -1,12 +1,4 @@ package cmc.mellyserver.auth.controller.dto.request; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ReIssueAccessTokenRequest { - - private String refreshToken; - +public record ReIssueAccessTokenRequest(String refreshToken) { } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CommonSignupRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/SignupRequest.java similarity index 59% rename from core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CommonSignupRequest.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/SignupRequest.java index ad8eab00..f100b4e9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/CommonSignupRequest.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/request/SignupRequest.java @@ -7,31 +7,33 @@ import cmc.mellyserver.dbcore.user.enums.Gender; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Pattern; -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CommonSignupRequest { +public record SignupRequest( @Email(message = "이메일 양식으로 작성해주세요.") - private String email; // 이메일 + String email, @Pattern(regexp = "^(?=.*\\d)(?=.*[a-zA-Z])[0-9a-zA-Z]{8,}", message = "비밀번호는 영문과 숫자 조합으로 8자리 이상 가능합니다.") - private String password; // 비밀번호 + String password, @Length(min = 2, max = 15, message = "닉네임은 2자 이상 15자 이하로 작성해주세요.") - private String nickname; // 닉네임 + String nickname, - private Gender gender; // 성별 + Gender gender, - private AgeGroup ageGroup; // 연령대 + AgeGroup ageGroup, - private String fcmToken; + String fcmToken +) { public AuthSignupRequestDto toDto() { - return new AuthSignupRequestDto(email, password, nickname, ageGroup, gender, fcmToken); + return AuthSignupRequestDto.builder() + .email(email) + .password(password) + .nickname(nickname) + .ageGroup(ageGroup) + .gender(gender) + .fcmToken(fcmToken) + .build(); } } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenResponse.java deleted file mode 100644 index 63a22b71..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class AccessTokenResponse { - - private int code; - - private String message; - - private AccessTokenUserData user; - - private String token; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenUserData.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenUserData.java index 1db22f01..c7f96d2b 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenUserData.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AccessTokenUserData.java @@ -4,32 +4,31 @@ import cmc.mellyserver.dbcore.user.enums.AgeGroup; import cmc.mellyserver.dbcore.user.enums.Gender; import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -public class AccessTokenUserData { +public record AccessTokenUserData( - private Long id; + Long id, - private String uid; + String uid, - private Provider provider; + Provider provider, - private String email; + String email, - private String nickname; + String nickname, - private String profileImage; + String profileImage, - private Gender gender; + Gender gender, - private AgeGroup ageGroup; + AgeGroup ageGroup + +) { + + @Builder + public AccessTokenUserData { + } public static AccessTokenUserData from(User user) { return AccessTokenUserData.builder() diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponse.java deleted file mode 100644 index cf1447a3..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@AllArgsConstructor -@Data -public class AuthResponse { - - private String appToken; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponseForLogin.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponseForLogin.java deleted file mode 100644 index 9e9d340e..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthResponseForLogin.java +++ /dev/null @@ -1,19 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.Builder; -import lombok.Data; - -@Data -public class AuthResponseForLogin { - - private AccessTokenUserData user; - - private String token; - - @Builder - public AuthResponseForLogin(AccessTokenUserData user, String token) { - this.user = user; - this.token = token; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthUserDataResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthUserDataResponse.java deleted file mode 100644 index 5b8791b8..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/AuthUserDataResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class AuthUserDataResponse { - - private int code; - - private String message; - - private AccessTokenUserData user; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateEmailResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateEmailResponse.java deleted file mode 100644 index 2838e29f..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateEmailResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class CheckDuplicateEmailResponse { - - private int code; - - private String message; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateNicknameResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateNicknameResponse.java deleted file mode 100644 index 53e7e720..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/CheckDuplicateNicknameResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class CheckDuplicateNicknameResponse { - - private int code; - - private String message; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/LoginResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/LoginResponse.java deleted file mode 100644 index f52d14c7..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/LoginResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -public class LoginResponse { - - private AccessTokenUserData user; - - private String token; - - @Builder - public LoginResponse(AccessTokenUserData user, String token) { - this.user = user; - this.token = token; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponse.java deleted file mode 100644 index 411f605c..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class OAuthLoginResponse { - - private AccessTokenUserData user; - - private String token; - - private boolean isNewUser; - - public OAuthLoginResponse(boolean isNewUser, AccessTokenUserData user) { - this.isNewUser = isNewUser; - this.user = AccessTokenUserData.builder().uid(user.getUid()).build(); - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponseDto.java deleted file mode 100644 index a6044789..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthLoginResponseDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class OAuthLoginResponseDto { - - private AccessTokenUserData user; - - private String token; - - private boolean isNewUser; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthSignupResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthSignupResponseDto.java deleted file mode 100644 index 97062510..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthSignupResponseDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class OAuthSignupResponseDto { - - private String socialId; - - private String provider; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/SignupResponse.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/SignupResponse.java deleted file mode 100644 index c520bf44..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/SignupResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import lombok.Builder; -import lombok.Data; - -@Data -public class SignupResponse { - - private AccessTokenUserData user; - - private String token; - - @Builder - public SignupResponse(AccessTokenUserData user, String token) { - this.user = user; - this.token = token; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/UserExistResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/UserExistResponseDto.java deleted file mode 100644 index 4c06e131..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/UserExistResponseDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package cmc.mellyserver.auth.controller.dto.response; - -import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class UserExistResponseDto { - - private Provider provider; - - private String email; - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthLoginRequestDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthLoginRequestDto.java index 8ad781d2..7d707af7 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthLoginRequestDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthLoginRequestDto.java @@ -1,27 +1,11 @@ package cmc.mellyserver.auth.dto.request; import lombok.Builder; -import lombok.Data; -/** - * AuthLoginDto.java - * - * @author jemlog - */ -@Data -public class AuthLoginRequestDto { - - private String email; - - private String password; - - private String fcmToken; +public record AuthLoginRequestDto(String email, String password, String fcmToken) { @Builder - public AuthLoginRequestDto(String email, String password, String fcmToken) { - this.email = email; - this.password = password; - this.fcmToken = fcmToken; + public AuthLoginRequestDto { } } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthSignupRequestDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthSignupRequestDto.java index 3669b71c..0e17e5d3 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthSignupRequestDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/AuthSignupRequestDto.java @@ -10,35 +10,26 @@ import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Pattern; import lombok.Builder; -import lombok.Data; -@Data -public class AuthSignupRequestDto { +public record AuthSignupRequestDto( @Email - private String email; // 이메일 받고 + String email, @Length(min = 2, max = 15, message = "닉네임은 2자 이상 15자 이하로 작성해주세요.") - private String nickname; // 닉네임 받고 + String nickname, @Pattern(regexp = "^(?=.*\\d)(?=.*[a-zA-Z])[0-9a-zA-Z]{8,}", message = "비밀번호는 영문과 숫자 조합으로 8자리 이상 가능합니다.") - private String password; // 비밀번호 받고 + String password, - private Gender gender; // 성별 받고 + Gender gender, - private AgeGroup ageGroup; // 연령대 받고 - - private String fcmToken; + AgeGroup ageGroup, + String fcmToken +) { @Builder - public AuthSignupRequestDto(String email, String password, String nickname, AgeGroup ageGroup, Gender gender, - String fcmToken) { - this.email = email; - this.password = password; - this.nickname = nickname; - this.ageGroup = ageGroup; - this.gender = gender; - this.fcmToken = fcmToken; + public AuthSignupRequestDto { } public User toEntity() { diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/ChangePasswordRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/ChangePasswordRequest.java deleted file mode 100644 index 22758635..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/ChangePasswordRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmc.mellyserver.auth.dto.request; - -import jakarta.validation.constraints.Pattern; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ChangePasswordRequest { - - private String email; - - @Pattern(regexp = "^(?=.*\\d)(?=.*[a-zA-Z])[0-9a-zA-Z]{8,}", message = "비밀번호는 영문과 숫자 조합으로 8자리 이상 가능합니다.") - private String passwordAfter; - - private String passwordBefore; - - @Builder - public ChangePasswordRequest(String email, String passwordAfter, String passwordBefore) { - this.email = email; - this.passwordAfter = passwordAfter; - this.passwordBefore = passwordBefore; - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/EmailCertificationRequest.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/EmailCertificationRequest.java new file mode 100644 index 00000000..5bb27e71 --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/EmailCertificationRequest.java @@ -0,0 +1,5 @@ +package cmc.mellyserver.auth.dto.request; + +public record EmailCertificationRequest(String email, String certificationNumber) { + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthLoginRequestDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthLoginRequestDto.java index 2ed33dd3..3d9fb8e6 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthLoginRequestDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthLoginRequestDto.java @@ -1,26 +1,12 @@ package cmc.mellyserver.auth.dto.request; import cmc.mellyserver.dbcore.user.enums.Provider; -import lombok.AccessLevel; import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class OAuthLoginRequestDto { - - private String accessToken; - - private Provider provider; - - private String fcmToken; +public record OAuthLoginRequestDto(String accessToken, Provider provider, String fcmToken) { @Builder - public OAuthLoginRequestDto(String accessToken, Provider provider, String fcmToken) { - this.accessToken = accessToken; - this.provider = provider; - this.fcmToken = fcmToken; + public OAuthLoginRequestDto { } } \ No newline at end of file diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthSignupRequestDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthSignupRequestDto.java new file mode 100644 index 00000000..7169c321 --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/request/OAuthSignupRequestDto.java @@ -0,0 +1,28 @@ +package cmc.mellyserver.auth.dto.request; + +import cmc.mellyserver.dbcore.user.User; +import cmc.mellyserver.dbcore.user.enums.AgeGroup; +import cmc.mellyserver.dbcore.user.enums.Gender; +import cmc.mellyserver.dbcore.user.enums.Provider; + +public record OAuthSignupRequestDto( + String email, + + String socialId, + + Provider provider, + + String nickname, + + Gender gender, + + AgeGroup ageGroup, + + String fcmToken +) { + + public User toEntity() { + return null; + } + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthLoginResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthLoginResponseDto.java index fc577b62..ee7d3cf0 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthLoginResponseDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthLoginResponseDto.java @@ -1,22 +1,7 @@ package cmc.mellyserver.auth.dto.response; import cmc.mellyserver.dbcore.user.enums.UserStatus; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -/** - * OAuthLoginResponseDto.java - * - * @author jemlog - */ -@Data -@AllArgsConstructor -@Builder -public class OAuthLoginResponseDto { - - private String accessToken; - - private UserStatus userStatus; +public record OAuthLoginResponseDto(String accessToken, UserStatus userStatus) { } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthResponseDto.java similarity index 53% rename from core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthResponseDto.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthResponseDto.java index 6b740505..5b4338c7 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/controller/dto/response/OAuthResponseDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthResponseDto.java @@ -1,16 +1,6 @@ -package cmc.mellyserver.auth.controller.dto.response; +package cmc.mellyserver.auth.dto.response; -import cmc.mellyserver.auth.dto.response.TokenResponseDto; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class OAuthResponseDto { - - public TokenResponseDto tokenInfo; - - public OAuthSignupResponseDto data; +public record OAuthResponseDto(TokenResponseDto tokenInfo, OAuthSignupResponseDto data) { public static OAuthResponseDto newUser(String socialId, String provider) { return new OAuthResponseDto(null, new OAuthSignupResponseDto(socialId, provider)); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthSignupResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthSignupResponseDto.java new file mode 100644 index 00000000..b86cde18 --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/OAuthSignupResponseDto.java @@ -0,0 +1,5 @@ +package cmc.mellyserver.auth.dto.response; + +public record OAuthSignupResponseDto(String socialId, String provider) { + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/RefreshTokenDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/RefreshTokenDto.java index 60989c60..259a12ae 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/RefreshTokenDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/RefreshTokenDto.java @@ -1,14 +1,4 @@ package cmc.mellyserver.auth.dto.response; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class RefreshTokenDto { - - private String token; - - private Long expiredAt; - +public record RefreshTokenDto(String token, long expiredAt) { } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/TokenResponseDto.java b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/TokenResponseDto.java index 9ebe6a73..7d9f8024 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/TokenResponseDto.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/dto/response/TokenResponseDto.java @@ -1,15 +1,6 @@ package cmc.mellyserver.auth.dto.response; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class TokenResponseDto { - - private String accessToken; - - private String refreshToken; +public record TokenResponseDto(String accessToken, String refreshToken) { public static TokenResponseDto of(String accessToken, String refreshToken) { return new TokenResponseDto(accessToken, refreshToken); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/repository/AuthTokenRepository.java b/core/core-api/src/main/java/cmc/mellyserver/auth/repository/AuthTokenRepository.java deleted file mode 100644 index ff00a54f..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/repository/AuthTokenRepository.java +++ /dev/null @@ -1,51 +0,0 @@ -package cmc.mellyserver.auth.repository; - -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.TimeUnit; - -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Repository; - -import cmc.mellyserver.auth.config.RedisConstants; -import cmc.mellyserver.auth.token.TokenProvider; -import lombok.RequiredArgsConstructor; - -@Repository -@RequiredArgsConstructor -public class AuthTokenRepository { - - private final RedisTemplate redisTemplate; - - private final TokenProvider tokenProvider; - - public void saveRefreshToken(final RefreshToken refreshToken, final Long refreshTokenExpire) { - redisTemplate.opsForValue() - .set(RedisConstants.REFRESH_TOKEN_PREFIX + refreshToken.userId(), refreshToken.refreshToken(), - refreshTokenExpire, TimeUnit.MILLISECONDS); - } - - public void makeAccessTokenDisabled(final String accessToken) { - redisTemplate.opsForValue() - .set(accessToken, RedisConstants.ACCESS_TOKEN_BLACKLIST, tokenProvider.getLastExpireTime(accessToken), - TimeUnit.MILLISECONDS); - } - - public Optional findRefreshToken(final Long userId) { - ValueOperations valueOperations = redisTemplate.opsForValue(); - String refreshToken = valueOperations.get(RedisConstants.REFRESH_TOKEN_PREFIX + userId); - - if (Objects.isNull(refreshToken)) { - return Optional.empty(); - } - - return Optional.of(new RefreshToken(refreshToken, userId)); - } - - public void removeRefreshToken(final Long userId) { - - redisTemplate.delete(RedisConstants.REFRESH_TOKEN_PREFIX + userId); - } - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/AuthService.java b/core/core-api/src/main/java/cmc/mellyserver/auth/service/AuthService.java similarity index 88% rename from core/core-api/src/main/java/cmc/mellyserver/auth/AuthService.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/service/AuthService.java index fb014f1f..c3b22d59 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/AuthService.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/service/AuthService.java @@ -1,19 +1,19 @@ -package cmc.mellyserver.auth; +package cmc.mellyserver.auth.service; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import cmc.mellyserver.auth.controller.dto.request.ChangePasswordRequest; import cmc.mellyserver.auth.dto.request.AuthLoginRequestDto; import cmc.mellyserver.auth.dto.request.AuthSignupRequestDto; -import cmc.mellyserver.auth.dto.request.ChangePasswordRequest; import cmc.mellyserver.auth.dto.response.TokenResponseDto; -import cmc.mellyserver.auth.repository.RefreshToken; +import cmc.mellyserver.auth.token.RefreshToken; import cmc.mellyserver.auth.token.TokenDto; import cmc.mellyserver.auth.token.TokenService; import cmc.mellyserver.dbcore.user.User; -import cmc.mellyserver.dbredis.repository.FcmTokenRepository; +import cmc.mellyserver.dbredis.FcmTokenRepository; import cmc.mellyserver.domain.comment.event.SignupEvent; import cmc.mellyserver.domain.user.UserReader; import cmc.mellyserver.domain.user.UserWriter; @@ -40,14 +40,14 @@ public class AuthService { @Transactional public TokenResponseDto signup(AuthSignupRequestDto authSignupRequestDto) { - checkDuplicatedEmail(authSignupRequestDto.getEmail()); + checkDuplicatedEmail(authSignupRequestDto.email()); User user = userWriter.save(authSignupRequestDto.toEntity()); TokenDto tokenDto = tokenService.createToken(user); fcmTokenRepository.saveToken(user.getId().toString(), user.getFcmToken()); publisher.publishEvent(new SignupEvent(user.getId())); - return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().getToken()); + return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().token()); } /* @@ -58,13 +58,13 @@ public TokenResponseDto signup(AuthSignupRequestDto authSignupRequestDto) { @Transactional public TokenResponseDto login(AuthLoginRequestDto authLoginRequestDto) { - User user = checkEmail(authLoginRequestDto.getEmail()); - checkPassword(authLoginRequestDto.getPassword(), user.getPassword()); + User user = checkEmail(authLoginRequestDto.email()); + checkPassword(authLoginRequestDto.password(), user.getPassword()); TokenDto tokenDto = tokenService.createToken(user); - fcmTokenRepository.saveToken(user.getId().toString(), authLoginRequestDto.getFcmToken()); + fcmTokenRepository.saveToken(user.getId().toString(), authLoginRequestDto.fcmToken()); - return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().getToken()); + return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().token()); } // Refresh Token Rotation (RTR) 전략 적용 @@ -78,7 +78,7 @@ public TokenResponseDto reIssueAccessTokenAndRefreshToken(final String token) { User user = userReader.findById(refreshToken.userId()); TokenDto tokenDto = tokenService.createToken(user); - return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().getToken()); + return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().token()); } public void logout(final Long userId, final String accessToken) { @@ -115,9 +115,9 @@ public void checkDuplicatedEmail(final String email) { @Transactional public void updateForgetPassword(ChangePasswordRequest requestDto) { - User user = userReader.findByEmail(requestDto.getEmail()) + User user = userReader.findByEmail(requestDto.email()) .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); - user.changePassword(requestDto.getPasswordAfter()); + user.changePassword(requestDto.passwordAfter()); } @Transactional @@ -125,8 +125,8 @@ public void changePassword(final Long userId, ChangePasswordRequest requestDto) User user = userReader.findById(userId); - String passwordBefore = passwordEncoder.encode(requestDto.getPasswordBefore()); - String passwordAfter = passwordEncoder.encode(requestDto.getPasswordAfter()); + String passwordBefore = passwordEncoder.encode(requestDto.passwordBefore()); + String passwordAfter = passwordEncoder.encode(requestDto.passwordAfter()); if (!userReader.existsByEmailAndPassword(user.getEmail(), passwordBefore)) { throw new BusinessException(ErrorCode.BEFORE_PASSWORD_NOT_EXIST); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/LoginClientFactory.java b/core/core-api/src/main/java/cmc/mellyserver/auth/service/LoginClientFactory.java similarity index 96% rename from core/core-api/src/main/java/cmc/mellyserver/auth/LoginClientFactory.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/service/LoginClientFactory.java index 69b33eb9..9b7e2dd3 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/LoginClientFactory.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/service/LoginClientFactory.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.auth; +package cmc.mellyserver.auth.service; import java.util.List; import java.util.Map; diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/OAuthService.java b/core/core-api/src/main/java/cmc/mellyserver/auth/service/OAuthService.java similarity index 80% rename from core/core-api/src/main/java/cmc/mellyserver/auth/OAuthService.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/service/OAuthService.java index 9ac6e4a1..b17af39e 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/OAuthService.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/service/OAuthService.java @@ -1,26 +1,24 @@ -package cmc.mellyserver.auth; +package cmc.mellyserver.auth.service; import java.util.Objects; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import cmc.mellyserver.auth.controller.dto.request.OAuthSignupRequestDto; -import cmc.mellyserver.auth.controller.dto.response.OAuthResponseDto; import cmc.mellyserver.auth.dto.request.OAuthLoginRequestDto; +import cmc.mellyserver.auth.dto.request.OAuthSignupRequestDto; +import cmc.mellyserver.auth.dto.response.OAuthResponseDto; import cmc.mellyserver.auth.dto.response.TokenResponseDto; import cmc.mellyserver.auth.token.TokenDto; import cmc.mellyserver.auth.token.TokenService; import cmc.mellyserver.clientauth.LoginClient; import cmc.mellyserver.clientauth.api.LoginClientResult; import cmc.mellyserver.dbcore.user.User; -import cmc.mellyserver.dbredis.repository.FcmTokenRepository; +import cmc.mellyserver.dbredis.FcmTokenRepository; import cmc.mellyserver.domain.user.UserReader; import cmc.mellyserver.domain.user.UserWriter; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -@Slf4j @Service @RequiredArgsConstructor public class OAuthService { @@ -40,15 +38,15 @@ public TokenResponseDto signup(OAuthSignupRequestDto oAuthSignupRequestDto) { User user = userWriter.save(oAuthSignupRequestDto.toEntity()); TokenDto tokenDto = tokenService.createToken(user); - fcmTokenRepository.saveToken(user.getId().toString(), oAuthSignupRequestDto.getFcmToken()); - return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().getToken()); + fcmTokenRepository.saveToken(user.getId().toString(), oAuthSignupRequestDto.fcmToken()); + return TokenResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().token()); } @Transactional public OAuthResponseDto login(OAuthLoginRequestDto oAuthLoginRequestDto) { - LoginClient loginClient = loginClientFactory.find(oAuthLoginRequestDto.getProvider()); - LoginClientResult socialUser = loginClient.getUserData(oAuthLoginRequestDto.getAccessToken()); + LoginClient loginClient = loginClientFactory.find(oAuthLoginRequestDto.provider()); + LoginClientResult socialUser = loginClient.getUserData(oAuthLoginRequestDto.accessToken()); User user = userReader.findBySocialId(socialUser.uid()); if (Objects.isNull(user)) { @@ -56,8 +54,8 @@ public OAuthResponseDto login(OAuthLoginRequestDto oAuthLoginRequestDto) { } TokenDto tokenDto = tokenService.createToken(user); - fcmTokenRepository.saveToken(user.getId().toString(), oAuthLoginRequestDto.getFcmToken()); - return OAuthResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().getToken()); + fcmTokenRepository.saveToken(user.getId().toString(), oAuthLoginRequestDto.fcmToken()); + return OAuthResponseDto.of(tokenDto.accessToken(), tokenDto.refreshToken().token()); } } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/token/AuthTokenRepository.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/AuthTokenRepository.java new file mode 100644 index 00000000..f52e89a9 --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/AuthTokenRepository.java @@ -0,0 +1,46 @@ +package cmc.mellyserver.auth.token; + +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class AuthTokenRepository { + + private final RedisTemplate redisTemplate; + + public void saveRefreshToken(RefreshToken refreshToken, Long refreshTokenExpiredTime) { + redisTemplate.opsForValue() + .set(TokenConstants.REFRESH_TOKEN_PREFIX + refreshToken.userId(), refreshToken.refreshToken(), + refreshTokenExpiredTime, TimeUnit.MILLISECONDS); + } + + public void makeAccessTokenDisabled(String accessToken, long lastExpiredTime) { + redisTemplate.opsForValue() + .set(accessToken, TokenConstants.ACCESS_TOKEN_BLACKLIST, lastExpiredTime, TimeUnit.MILLISECONDS); + } + + public Optional findRefreshToken(Long userId) { + ValueOperations valueOperations = redisTemplate.opsForValue(); + String refreshToken = valueOperations.get(TokenConstants.REFRESH_TOKEN_PREFIX + userId); + + if (Objects.isNull(refreshToken)) { + return Optional.empty(); + } + + return Optional.of(new RefreshToken(refreshToken, userId)); + } + + public void removeRefreshToken(Long userId) { + + redisTemplate.delete(TokenConstants.REFRESH_TOKEN_PREFIX + userId); + } + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/token/JwtTokenProvider.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/JwtTokenProvider.java index 2869f125..95a8efeb 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/token/JwtTokenProvider.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/JwtTokenProvider.java @@ -30,9 +30,7 @@ @Component public class JwtTokenProvider implements TokenProvider { - protected final String secret; - - protected final Key secretKey; + private final Key secretKey; private final long accessExpirationTime; @@ -43,7 +41,6 @@ public JwtTokenProvider( @Value("${app.auth.access-expiration-time}") long accessExpirationTime, @Value("${app.auth.refresh-expiration-time}") long refreshExpirationTime ) { - this.secret = secret; this.accessExpirationTime = accessExpirationTime; this.refreshExpirationTime = refreshExpirationTime; byte[] keyBytes = Decoders.BASE64.decode(secret); @@ -100,7 +97,7 @@ public Authentication getAuthentication(String token) { } @Override - public long getLastExpireTime(String token) { + public long getLastExpiredTime(String token) { Date expirationDate = Jwts.parserBuilder() .setSigningKey(secretKey) @@ -114,7 +111,7 @@ public long getLastExpireTime(String token) { } @Override - public Long extractUserId(String accessToken) { + public long extractUserId(String accessToken) { try { String memberId = Jwts.parserBuilder() diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/repository/RefreshToken.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/RefreshToken.java similarity index 61% rename from core/core-api/src/main/java/cmc/mellyserver/auth/repository/RefreshToken.java rename to core/core-api/src/main/java/cmc/mellyserver/auth/token/RefreshToken.java index 2eb9777d..6f28431b 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/repository/RefreshToken.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/RefreshToken.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.auth.repository; +package cmc.mellyserver.auth.token; public record RefreshToken(String refreshToken, Long userId) { diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenConstants.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenConstants.java index 84c10a4d..dbc7cef3 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenConstants.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenConstants.java @@ -2,11 +2,15 @@ public abstract class TokenConstants { - protected static final String ROLE = "role"; + public static final String ROLE = "role"; - protected static final String AUTHORITY_KEY = "auth"; + public static final String AUTHORITY_KEY = "auth"; - protected static final String ACCESS_TOKEN = "access_token"; + public static final String ACCESS_TOKEN = "access_token"; - protected static final String REFRESH_TOKEN = "refresh_token"; + public static final String REFRESH_TOKEN = "refresh_token"; + + public static final String REFRESH_TOKEN_PREFIX = "rft:user-id:"; + + public static final String ACCESS_TOKEN_BLACKLIST = "blackList"; } diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenProvider.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenProvider.java index 263bfe2f..f84fbae9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenProvider.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenProvider.java @@ -13,9 +13,9 @@ public interface TokenProvider { Authentication getAuthentication(String accessToken); - long getLastExpireTime(String accessToken); + long getLastExpiredTime(String accessToken); - Long extractUserId(String accessToken); + long extractUserId(String accessToken); boolean validateToken(String accessToken); diff --git a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenService.java b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenService.java index f88d05b0..b0e1a794 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenService.java +++ b/core/core-api/src/main/java/cmc/mellyserver/auth/token/TokenService.java @@ -3,8 +3,6 @@ import org.springframework.stereotype.Component; import cmc.mellyserver.auth.dto.response.RefreshTokenDto; -import cmc.mellyserver.auth.repository.AuthTokenRepository; -import cmc.mellyserver.auth.repository.RefreshToken; import cmc.mellyserver.dbcore.user.User; import cmc.mellyserver.support.exception.BusinessException; import cmc.mellyserver.support.exception.ErrorCode; @@ -21,8 +19,8 @@ public class TokenService { public TokenDto createToken(User user) { String accessToken = tokenProvider.createAccessToken(user.getId(), user.getRoleType()); RefreshTokenDto refreshToken = tokenProvider.createRefreshToken(user.getId(), user.getRoleType()); - tokenRepository.saveRefreshToken(new RefreshToken(refreshToken.getToken(), user.getId()), - refreshToken.getExpiredAt()); + tokenRepository.saveRefreshToken(new RefreshToken(refreshToken.token(), user.getId()), + refreshToken.expiredAt()); return new TokenDto(accessToken, refreshToken); } @@ -33,7 +31,8 @@ public RefreshToken findRefreshToken(Long userId) { } public void makeAccessTokenDisabled(String accessToken) { - tokenRepository.makeAccessTokenDisabled(accessToken); + long lastExpireTime = tokenProvider.getLastExpiredTime(accessToken); + tokenRepository.makeAccessTokenDisabled(accessToken, lastExpireTime); } public void removeRefreshToken(Long userId) { diff --git a/core/core-api/src/main/java/cmc/mellyserver/common/event/CertificationCompletedEvent.java b/core/core-api/src/main/java/cmc/mellyserver/common/event/CertificationCompletedEvent.java new file mode 100644 index 00000000..cd851e2c --- /dev/null +++ b/core/core-api/src/main/java/cmc/mellyserver/common/event/CertificationCompletedEvent.java @@ -0,0 +1,5 @@ +package cmc.mellyserver.common.event; + +public record CertificationCompletedEvent(String email, String content) { + +} diff --git a/core/core-api/src/main/java/cmc/mellyserver/common/event/SignupCertificationEvent.java b/core/core-api/src/main/java/cmc/mellyserver/common/event/SignupCertificationEvent.java deleted file mode 100644 index 9a3deff9..00000000 --- a/core/core-api/src/main/java/cmc/mellyserver/common/event/SignupCertificationEvent.java +++ /dev/null @@ -1,5 +0,0 @@ -package cmc.mellyserver.common.event; - -public record SignupCertificationEvent(String email, String content) { - -} diff --git a/core/core-api/src/main/java/cmc/mellyserver/common/event/handler/SignupCertificationEventHandler.java b/core/core-api/src/main/java/cmc/mellyserver/common/event/handler/SignupCertificationEventHandler.java index 0218bf17..e2a1df8a 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/common/event/handler/SignupCertificationEventHandler.java +++ b/core/core-api/src/main/java/cmc/mellyserver/common/event/handler/SignupCertificationEventHandler.java @@ -5,7 +5,7 @@ import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; -import cmc.mellyserver.common.event.SignupCertificationEvent; +import cmc.mellyserver.common.event.CertificationCompletedEvent; import cmc.mellyserver.mail.EmailConstants; import cmc.mellyserver.mail.EmailService; import lombok.RequiredArgsConstructor; @@ -18,7 +18,7 @@ class SignupCertificationEventHandler { @Async @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) - public void handle(SignupCertificationEvent event) { + public void handle(CertificationCompletedEvent event) { emailService.send(EmailConstants.TITLE_CERTIFICATION, event.content(), event.email()); } diff --git a/core/core-api/src/main/java/cmc/mellyserver/config/web/WebConfig.java b/core/core-api/src/main/java/cmc/mellyserver/config/web/WebConfig.java index 3baac87f..c23bfdf3 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/config/web/WebConfig.java +++ b/core/core-api/src/main/java/cmc/mellyserver/config/web/WebConfig.java @@ -6,7 +6,7 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import cmc.mellyserver.common.resolver.LoginUserIdArgumentResolver; +import cmc.mellyserver.auth.common.resolver.LoginUserIdArgumentResolver; import lombok.RequiredArgsConstructor; @Configuration diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/comment/CommentController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/comment/CommentController.java index 48351ef7..aa5db541 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/comment/CommentController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/comment/CommentController.java @@ -10,8 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.comment.dto.CommentAssembler; import cmc.mellyserver.controller.comment.dto.request.CommentRequest; import cmc.mellyserver.controller.comment.dto.request.CommentUpdateRequest; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/group/GroupController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/group/GroupController.java index 234085d5..151637e0 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/group/GroupController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/group/GroupController.java @@ -10,8 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.group.dto.GroupAssembler; import cmc.mellyserver.controller.group.dto.request.GroupCreateRequest; import cmc.mellyserver.controller.group.dto.request.GroupUpdateRequest; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/memory/MemoryController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/memory/MemoryController.java index f747fcb8..8e638d37 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/memory/MemoryController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/memory/MemoryController.java @@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.memory.dto.MemoryAssembler; import cmc.mellyserver.controller.memory.dto.request.MemoryCreateRequest; import cmc.mellyserver.controller.memory.dto.request.MemoryUpdateRequest; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/notification/NotificationController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/notification/NotificationController.java index c4f4f3a8..085cb3d9 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/notification/NotificationController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/notification/NotificationController.java @@ -9,8 +9,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.notification.dto.request.NotificationCheckRequest; import cmc.mellyserver.controller.notification.dto.response.NotificationResponse; import cmc.mellyserver.dbcore.notification.enums.NotificationType; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/place/PlaceController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/place/PlaceController.java index 1a43751e..23d9c673 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/place/PlaceController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/place/PlaceController.java @@ -11,8 +11,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.memory.dto.MemoryAssembler; import cmc.mellyserver.controller.memory.dto.response.FindPlaceInfoByMemoryNameResponse; import cmc.mellyserver.controller.place.dto.request.PlaceSimpleRequest; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/scrap/PlaceScrapController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/scrap/PlaceScrapController.java index 02e0422a..be4401b6 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/scrap/PlaceScrapController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/scrap/PlaceScrapController.java @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.scrap.dto.request.ScrapCancelRequest; import cmc.mellyserver.controller.scrap.dto.request.ScrapRequest; import cmc.mellyserver.dbcore.place.Position; diff --git a/core/core-api/src/main/java/cmc/mellyserver/controller/user/UserController.java b/core/core-api/src/main/java/cmc/mellyserver/controller/user/UserController.java index 9049f7ed..7f6f9ce3 100644 --- a/core/core-api/src/main/java/cmc/mellyserver/controller/user/UserController.java +++ b/core/core-api/src/main/java/cmc/mellyserver/controller/user/UserController.java @@ -15,8 +15,8 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import cmc.mellyserver.auth.controller.dto.common.CurrentUser; -import cmc.mellyserver.auth.controller.dto.common.LoginUser; +import cmc.mellyserver.auth.common.resolver.CurrentUser; +import cmc.mellyserver.auth.common.resolver.LoginUser; import cmc.mellyserver.controller.user.dto.UserAssembler; import cmc.mellyserver.controller.user.dto.request.ProfileUpdateRequest; import cmc.mellyserver.controller.user.dto.response.PlaceScrapCountResponse; diff --git a/core/core-api/src/test/java/cmc/mellyserver/common/mock/MockMailCertificationService.java b/core/core-api/src/test/java/cmc/mellyserver/common/mock/MockMailCertificationService.java index 2f765e7f..4964784a 100644 --- a/core/core-api/src/test/java/cmc/mellyserver/common/mock/MockMailCertificationService.java +++ b/core/core-api/src/test/java/cmc/mellyserver/common/mock/MockMailCertificationService.java @@ -3,8 +3,8 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; -import cmc.mellyserver.auth.certification.CertificationService; -import cmc.mellyserver.auth.certification.EmailCertificationRequest; +import cmc.mellyserver.auth.certificate.CertificationService; +import cmc.mellyserver.auth.dto.request.EmailCertificationRequest; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/infra/notification/src/main/java/cmc/mellyserver/notification/fcm/FCMSendService.java b/infra/notification/src/main/java/cmc/mellyserver/notification/fcm/FCMSendService.java index 2817e468..1e8e9f03 100644 --- a/infra/notification/src/main/java/cmc/mellyserver/notification/fcm/FCMSendService.java +++ b/infra/notification/src/main/java/cmc/mellyserver/notification/fcm/FCMSendService.java @@ -6,7 +6,7 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.Message; -import cmc.mellyserver.dbredis.repository.FcmTokenRepository; +import cmc.mellyserver.dbredis.FcmTokenRepository; import cmc.mellyserver.notification.NotificationService; import cmc.mellyserver.notification.constants.NotificationConstants; import lombok.RequiredArgsConstructor; diff --git a/storage/db-redis/src/main/java/cmc/mellyserver/dbredis/repository/FcmTokenRepository.java b/storage/db-redis/src/main/java/cmc/mellyserver/dbredis/FcmTokenRepository.java similarity index 93% rename from storage/db-redis/src/main/java/cmc/mellyserver/dbredis/repository/FcmTokenRepository.java rename to storage/db-redis/src/main/java/cmc/mellyserver/dbredis/FcmTokenRepository.java index 3e0b720a..e97da9d9 100644 --- a/storage/db-redis/src/main/java/cmc/mellyserver/dbredis/repository/FcmTokenRepository.java +++ b/storage/db-redis/src/main/java/cmc/mellyserver/dbredis/FcmTokenRepository.java @@ -1,4 +1,4 @@ -package cmc.mellyserver.dbredis.repository; +package cmc.mellyserver.dbredis; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository;