diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/VerifyEmailCodeRequest.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/VerifyEmailCodeRequest.java new file mode 100644 index 00000000..3b78f333 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/VerifyEmailCodeRequest.java @@ -0,0 +1,13 @@ +package org.ezcode.codetest.application.usermanagement.auth.dto.request; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class VerifyEmailCodeRequest { + + @NotBlank(message = "인증 번호는 공백일 수 없습니다") + private String verificationCode; +} diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SendEmailCodeResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SendEmailCodeResponse.java new file mode 100644 index 00000000..34a86453 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SendEmailCodeResponse.java @@ -0,0 +1,13 @@ +package org.ezcode.codetest.application.usermanagement.auth.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "인증코드 전송 성공") +public record SendEmailCodeResponse( + @Schema(description = "인증코드 전송 성공 메세지") + String message +) { + public static SendEmailCodeResponse from(String message) { + return new SendEmailCodeResponse(message); + } +} diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SignupResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SignupResponse.java index bb143477..ba4ef32d 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SignupResponse.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/SignupResponse.java @@ -4,10 +4,10 @@ @Schema(description = "회원가입 응답") public record SignupResponse( - @Schema(description = "생성된 token") - String token + @Schema(description = "회원 가입 완료 메세지") + String message ) { - public static SignupResponse from(String token) { - return new SignupResponse(token); + public static SignupResponse from(String message) { + return new SignupResponse(message); } } diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/VerifyEmailCodeResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/VerifyEmailCodeResponse.java new file mode 100644 index 00000000..93d76bc7 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/VerifyEmailCodeResponse.java @@ -0,0 +1,13 @@ +package org.ezcode.codetest.application.usermanagement.auth.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "이메일 인증 번호 입력 응답") +public record VerifyEmailCodeResponse( + @Schema(description = "인증 번호 성공 응답 메세지") + String message +) { + public static VerifyEmailCodeResponse from(String message) { + return new VerifyEmailCodeResponse(message); + } +} diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java index ffa8ca97..0510162f 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java @@ -3,17 +3,23 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import org.ezcode.codetest.application.usermanagement.auth.dto.request.VerifyEmailCodeRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.response.RefreshTokenResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SigninRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.SendEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.response.SigninResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SignupRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.response.SignupResponse; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.VerifyEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.user.dto.response.LogoutResponse; import org.ezcode.codetest.domain.user.exception.AuthException; +import org.ezcode.codetest.domain.user.exception.UserException; import org.ezcode.codetest.domain.user.exception.code.AuthExceptionCode; +import org.ezcode.codetest.domain.user.exception.code.UserExceptionCode; import org.ezcode.codetest.domain.user.model.entity.User; import org.ezcode.codetest.domain.user.model.entity.UserAuthType; import org.ezcode.codetest.domain.user.model.enums.AuthType; +import org.ezcode.codetest.domain.user.service.MailService; import org.ezcode.codetest.domain.user.service.UserDomainService; import org.ezcode.codetest.common.security.util.JwtUtil; import org.springframework.data.redis.core.RedisTemplate; @@ -33,7 +39,7 @@ public class AuthService { private final UserDomainService userDomainService; private final JwtUtil jwtUtil; private final RedisTemplate redisTemplate; - + private final MailService mailService; /* 이메일 회원가입 @@ -41,60 +47,92 @@ public class AuthService { - 비밀번호 암호화 */ @Transactional - public SignupResponse signup(SignupRequest signupRequest) { + public SignupResponse signup(SignupRequest request) { + validateRequest(request); + userRegisterationProcess(request); - userDomainService.checkEmailUnique(signupRequest.getEmail()); + return SignupResponse.from("회원가입이 완료되었습니다."); + } - if (!signupRequest.getPassword().equals(signupRequest.getPasswordConfirm())){ + //1. 보낸 요청의 비밀번호&비밀번호확인이 일치하는지 + private void validateRequest(SignupRequest request) { + userDomainService.checkEmailUnique(request.getEmail()); + if (!request.getPassword().equals(request.getPasswordConfirm())){ throw new AuthException(AuthExceptionCode.PASSWORD_NOT_MATCH); + }; + } + + //2. 이미 다른 방식으로 회원가입한 유저인지 검증 + private void userRegisterationProcess(SignupRequest request) { + String encodedPassword = userDomainService.encodePassword(request.getPassword()); + User existUser = userDomainService.getUserByEmail(request.getEmail()); + if ((existUser == null)) { + createNewUser(request, encodedPassword); + } else { + updateExistingUser(existUser, encodedPassword); } + } - String encodedPassword = userDomainService.encodePassword(signupRequest.getPassword()); + //3. 만약 아예 첫 가입 유저일 때 + private void createNewUser(SignupRequest request, String encodedPassword) { + User newUser = User.emailUser( + request.getEmail(), + encodedPassword, + request.getUsername(), + request.getNickname(), + request.getAge() + ); - User existUser = userDomainService.getUserByEmail(signupRequest.getEmail()); + userDomainService.createUser(newUser); + userDomainService.createUserAuthType(new UserAuthType(newUser, AuthType.EMAIL)); - String bearToken; + } - //만약 아예 유저 테이블에 없으면 둘 다 저장 - if (existUser == null) { - User newUser = User.emailUser( - signupRequest.getEmail(), - encodedPassword, - signupRequest.getUsername(), - signupRequest.getNickname(), - signupRequest.getAge() - ); - UserAuthType userAuthType = new UserAuthType(newUser, AuthType.EMAIL); - userDomainService.createUser(newUser); - userDomainService.createUserAuthType(userAuthType); - - bearToken = jwtUtil.createAccessToken( - newUser.getId(), - newUser.getEmail(), - newUser.getRole(), - newUser.getUsername(),newUser.getNickname(), - newUser.getTier()); - } else { - //유저 테이블에는 존재하다면 AuthType만 추가 - UserAuthType userAuthType = new UserAuthType(existUser, AuthType.EMAIL); - userDomainService.createUserAuthType(userAuthType); - - //로컬 가입(이메일)은 안되어있는데 소셜은 되어있는 경우이므로, UUID 비번을 사용자가 지정한 비번으로 변경한다. -> 이후 비번 변경하면 User테이블에서 변경하면됨. - existUser.modifyPassword(encodedPassword); - log.info("유저 타입 저장 완료 {}", userAuthType); - - bearToken = jwtUtil.createAccessToken( - existUser.getId(), - existUser.getEmail(), - existUser.getRole(), - existUser.getUsername(), - existUser.getNickname(), - existUser.getTier()); - } + //4. 만약 이전에 다른 방식으로 가입했었던(소셜) 회원일 때 -> UserAuthType테이블에 인증 방식만 추가 + private void updateExistingUser(User existUser, String encodedPassword) { + //로컬 가입(이메일)은 안되어있는데 소셜은 되어있는 경우이므로, UUID 비번을 사용자가 지정한 비번으로 변경한다. + // -> 이후 비번 변경하면 User테이블에서 변경하면됨. + existUser.modifyPassword(encodedPassword); + UserAuthType userAuthType = new UserAuthType(existUser, AuthType.EMAIL); + userDomainService.createUserAuthType(userAuthType); + } + @Transactional + public SendEmailCodeResponse sendEmailCode(Long userId, String email) { + mailService.sendMail(userId, email); + return SendEmailCodeResponse.from("인증 코드를 전송했습니다."); + } + + @Transactional + public VerifyEmailCodeResponse verifyEmailCode(Long userId, VerifyEmailCodeRequest verifyEmailCodeRequest) { + boolean isMatch = mailService.verifyCode(userId, verifyEmailCodeRequest.getVerificationCode()); + User user = userDomainService.getUserById(userId); + if (isMatch){ + user.setVerified(); + return VerifyEmailCodeResponse.from("인증되었습니다"); + } else { + throw new UserException(UserExceptionCode.NOT_MATCH_CODE); + } + } - return SignupResponse.from(bearToken); + private String createAccessToken(User user) { + return jwtUtil.createAccessToken( + user.getId(), + user.getEmail(), + user.getRole(), + user.getUsername(), + user.getNickname(), + user.getTier()); + } + private String createRefreshToken(User user) { + String refreshToken = jwtUtil.createRefreshToken(user.getId()); + redisTemplate.opsForValue().set( + "RefreshToken:" + user.getId(), + refreshToken, + jwtUtil.getExpiration(refreshToken), + TimeUnit.MILLISECONDS); + return refreshToken; } /* @@ -118,33 +156,16 @@ public SigninResponse signin(@Valid SigninRequest signinRequest) { userDomainService.userPasswordCheck(signinRequest.getEmail(), signinRequest.getPassword()); - log.info("비밀번호 체크 완료"); - - String bearToken = jwtUtil.createAccessToken( - loginUser.getId(), - loginUser.getEmail(), - loginUser.getRole(), - loginUser.getUsername(), - loginUser.getNickname(), - loginUser.getTier()); - - log.info("토큰 발급 완료"); + String accessToken = createAccessToken(loginUser); //refresh 토큰 발급 - String refreshToken = jwtUtil.createRefreshToken(loginUser.getId()); - log.info("refresh token 발급 완료"); - - //redis에 RefreshToken : {} 형식으로 저장 - redisTemplate.opsForValue().set( - "RefreshToken:" + loginUser.getId(), - refreshToken, - jwtUtil.getExpiration(refreshToken), - TimeUnit.MILLISECONDS); + String refreshToken = createRefreshToken(loginUser); - return SigninResponse.from(bearToken, refreshToken); + return SigninResponse.from(accessToken, refreshToken); } + @Transactional public LogoutResponse logout(Long userId, String token) { Long expiration = jwtUtil.getRemainingTime(token); @@ -167,30 +188,23 @@ public LogoutResponse logout(Long userId, String token) { } //토큰 재발급 + @Transactional public RefreshTokenResponse refreshToken(String token) { log.info("서비스 입장"); Long userId = jwtUtil.getUserId(token); - log.info("유저 아이디 가져옴 id : {}", userId); String savedToken = redisTemplate.opsForValue().get("RefreshToken:" + userId); - log.info("저장된 토큰 가져옴 {}", savedToken); + if (savedToken==null || !savedToken.equals(token)){ - log.error("저장된 토큰 없음"); throw new AuthException(AuthExceptionCode.INVALID_REFRESH_TOKEN); } User user = userDomainService.getUserById(userId); - log.info("유저 도메인서비스에서 유저 아이디로 유저 찾아옴"); - String newAccessToken = jwtUtil.createAccessToken( - user.getId(), - user.getEmail(), - user.getRole(), - user.getUsername(), - user.getNickname(), - user.getTier() - ); + + String newAccessToken = createAccessToken(user); return RefreshTokenResponse.from(newAccessToken); } + } diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java index 1da07842..01bd4720 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java @@ -4,6 +4,9 @@ import java.time.temporal.ChronoUnit; import java.util.List; +import org.ezcode.codetest.application.usermanagement.auth.dto.request.VerifyEmailCodeRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.SendEmailCodeResponse; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.VerifyEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.user.model.UsersByWeek; import org.ezcode.codetest.domain.submission.dto.WeeklySolveCount; import org.ezcode.codetest.application.usermanagement.user.dto.request.ChangeUserPasswordRequest; @@ -13,16 +16,20 @@ import org.ezcode.codetest.application.usermanagement.user.dto.response.WithdrawUserResponse; import org.ezcode.codetest.domain.submission.service.SubmissionDomainService; import org.ezcode.codetest.domain.user.exception.AuthException; +import org.ezcode.codetest.domain.user.exception.UserException; import org.ezcode.codetest.domain.user.exception.code.AuthExceptionCode; +import org.ezcode.codetest.domain.user.exception.code.UserExceptionCode; import org.ezcode.codetest.domain.user.model.entity.AuthUser; import org.ezcode.codetest.domain.user.model.entity.User; import org.ezcode.codetest.domain.user.model.enums.AuthType; +import org.ezcode.codetest.domain.user.service.MailService; import org.ezcode.codetest.domain.user.service.UserDomainService; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,6 +41,7 @@ public class UserService { private final UserDomainService userDomainService; private final SubmissionDomainService submissionDomainService; private final RedisTemplate redisTemplate; + private final MailService mailService; @Transactional(readOnly = true) public UserInfoResponse getUserInfo(AuthUser authUser) { @@ -123,4 +131,5 @@ public void resetAllUsersTokensWeekly(LocalDateTime startDateTime, LocalDateTime userDomainService.resetReviewTokensForUsers(UsersByWeek.from(counts, weekLength)); } + } diff --git a/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java b/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java index 03343e47..5117b972 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java +++ b/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java @@ -11,7 +11,7 @@ public enum UserExceptionCode implements ResponseCode { NOT_ENOUGH_TOKEN(false, HttpStatus.BAD_REQUEST, "리뷰 토큰이 부족합니다."), - ; + NOT_MATCH_CODE(false, HttpStatus.BAD_REQUEST, "이메일 인증 코드가 일치하지 않습니다."); private final boolean success; private final HttpStatus status; diff --git a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java index 5e17439b..104ebbeb 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java +++ b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java @@ -71,6 +71,8 @@ public class User extends BaseEntity { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List userAuthTypes = new ArrayList<>(); + private boolean verified; //이메일 인증 여부 + /* @@ -88,6 +90,7 @@ public static User emailUser(String email, String password, String username, Str .tier(Tier.NEWBIE) .role(UserRole.ADMIN) // 테스트용 .isDeleted(false) + .verified(false) .build(); } @@ -104,13 +107,14 @@ public static User socialUser(String email, String username, String nickname, St .nickname(nickname) //닉네임 자동 생성 .password(password) .isDeleted(false) + .verified(false) .build(); } @Builder public User(String email, String password, String username, String nickname, - Integer age, Tier tier, UserRole role, boolean isDeleted) { + Integer age, Tier tier, UserRole role, boolean isDeleted, boolean verified) { this.email = email; this.password = password; this.username = username; @@ -119,6 +123,7 @@ public User(String email, String password, String username, String nickname, this.tier = tier; this.role = role; this.isDeleted = isDeleted; + this.verified = verified; } /* @@ -148,6 +153,10 @@ public void modifyPassword(String newPassword) { this.password = newPassword; } + public void setVerified(){ + this.verified = true; + } + public void decreaseReviewToken() { this.reviewToken -= 1; } diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java index 2e9a466a..d6164870 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java @@ -1,36 +1,47 @@ package org.ezcode.codetest.domain.user.service; +import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; + import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service @RequiredArgsConstructor public class MailService { private final JavaMailSender javaMailSender; + private final RedisTemplate redisTemplate; + @Value("${spring.mail.username}") private String senderEmail; - private static int number; - // 랜덤으로 숫자 생성 - public static void createNumber() { - number = (int)(Math.random() * (90000)) + 100000; //(int) Math.random() * (최댓값-최소값+1) + 최소값 + private static final long EXPIRATION_MINUTES = 3; + + public void sendMail(Long userId, String mail) { + MimeMessage message = CreateMail(userId, mail); + javaMailSender.send(message); } - public MimeMessage CreateMail(String mail) { - createNumber(); + + //메일 보내기 + public MimeMessage CreateMail(Long userId, String mail) { + String code = createNumber(userId); MimeMessage message = javaMailSender.createMimeMessage(); try { message.setFrom(senderEmail); message.setRecipients(MimeMessage.RecipientType.TO, mail); - message.setSubject("이메일 인증"); + message.setSubject("EZcode 이메일 인증"); String body = ""; body += "

" + "요청하신 인증 번호입니다." + "

"; - body += "

" + number + "

"; + body += "

" + code + "

"; body += "

" + "감사합니다." + "

"; message.setText(body,"UTF-8", "html"); } catch (MessagingException e) { @@ -40,10 +51,46 @@ public MimeMessage CreateMail(String mail) { return message; } - public int sendMail(String mail) { - MimeMessage message = CreateMail(mail); - javaMailSender.send(message); - return number; + // 랜덤으로 인증 번호 생성 + public String createNumber(Long userId) { + String verificationCode = generateRandomCode(); + String redisKey = "VERIFY_CODE:" + userId; + + redisTemplate.opsForValue().set( + redisKey, + verificationCode, + EXPIRATION_MINUTES, + TimeUnit.MINUTES + ); + return verificationCode; + } + + // 6자리 랜덤 인증번호 생성 + private String generateRandomCode() { + SecureRandom secureRandom = new SecureRandom(); + int randomNum = secureRandom.nextInt(900000) + 100000; + return String.valueOf(randomNum); + } + + /* + 입력한 번호 인증 + */ + public boolean verifyCode(Long userId, String inputCode) { + String key = "VERIFY_CODE:" + userId; + String storedCode = redisTemplate.opsForValue().get(key); + + if (storedCode == null) { + log.warn("인증코드 발급이 안된 유저임 : {}", userId); + return false; + } + + boolean isMatch = inputCode != null && inputCode.trim().equals(storedCode); + + //번호 검증되면 삭제하기 + if (isMatch) { + redisTemplate.delete(key); + } + return isMatch; } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java index d3b14696..598014e7 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java @@ -2,11 +2,14 @@ import java.util.Optional; +import org.ezcode.codetest.application.usermanagement.auth.dto.request.VerifyEmailCodeRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.response.RefreshTokenResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SigninRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.SendEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.response.SigninResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SignupRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.response.SignupResponse; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.VerifyEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.auth.service.AuthService; import org.ezcode.codetest.application.usermanagement.user.dto.response.LogoutResponse; import org.ezcode.codetest.domain.user.exception.AuthException; @@ -16,6 +19,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -74,4 +78,21 @@ public ResponseEntity refresh(HttpServletRequest request) log.info("Refresh token 추출 : {}", token); return ResponseEntity.status(HttpStatus.OK).body(authService.refreshToken(token)); } + + @Operation(summary = "이메일 인증 코드 전송", description = "현재 로그인된 회원의 이메일로 인증 코드를 전송합니다.") + @PostMapping("/email/send") + public ResponseEntity sendMailCode( + @AuthenticationPrincipal AuthUser authUser + ){ + return ResponseEntity.status(HttpStatus.CREATED).body(authService.sendEmailCode(authUser.getId(), authUser.getEmail())); + } + + @Operation(summary = "이메일 코드 입력 및 인증", description = "이메일로 받은 코드를 입력하여 이메일 인증된 회원으로 전환합니다") + @PutMapping("/email/verify") + public ResponseEntity verifyEmailCode( + @AuthenticationPrincipal AuthUser authUser, + @Valid @RequestBody VerifyEmailCodeRequest verifyEmailCodeRequest + ){ + return ResponseEntity.status(HttpStatus.OK).body(authService.verifyEmailCode(authUser.getId(), verifyEmailCodeRequest)); + } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/MailCheckController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/MailCheckController.java deleted file mode 100644 index 38798dd7..00000000 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/MailCheckController.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.ezcode.codetest.presentation.usermanagement; - -import java.util.HashMap; - -import org.ezcode.codetest.domain.user.model.entity.AuthUser; -import org.ezcode.codetest.domain.user.service.MailService; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class MailCheckController { - private final MailService mailService; - private int number; // 이메일 인증 숫자를 저장하는 변수 - - // 인증 이메일 전송 - @PostMapping("/mailSend") - public HashMap mailSend( - @AuthenticationPrincipal AuthUser authUser) { - HashMap map = new HashMap<>(); - - try { - number = mailService.sendMail(authUser.getEmail()); - - map.put("success", Boolean.TRUE); - } catch (Exception e) { - map.put("success", Boolean.FALSE); - map.put("error", e.getMessage()); - } - - return map; - } - - // 인증번호 일치여부 확인 - @GetMapping("/mailCheck") - public ResponseEntity mailCheck(@RequestParam String userNumber) { - - boolean isMatch = userNumber.equals(String.valueOf(number)); - - return ResponseEntity.ok(isMatch); - } -} diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java index 7bb4575e..d45e8fe8 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java @@ -1,5 +1,8 @@ package org.ezcode.codetest.presentation.usermanagement; +import org.ezcode.codetest.application.usermanagement.auth.dto.request.VerifyEmailCodeRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.SendEmailCodeResponse; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.VerifyEmailCodeResponse; import org.ezcode.codetest.application.usermanagement.user.dto.request.ModifyUserInfoRequest; import org.ezcode.codetest.application.usermanagement.user.dto.request.ChangeUserPasswordRequest; import org.ezcode.codetest.application.usermanagement.user.dto.response.ChangeUserPasswordResponse; @@ -12,6 +15,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -56,7 +60,6 @@ public ResponseEntity modifyUserPassword( return ResponseEntity.status(HttpStatus.OK).body(userService.modifyUserPassword(authUser, changeUserPasswordRequest)); } - @Operation(summary = "회원 탈퇴", description = "현재 로그인된 사용자를 탈퇴 처리합니다.") @DeleteMapping("/users/withdraw") public ResponseEntity withdraw(