diff --git a/src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java b/src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java index 2b5d7612..0555b2fe 100644 --- a/src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java +++ b/src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java @@ -139,7 +139,7 @@ public void incrementCorrectSubmissions() { } public boolean isGitPushStatus() { - return user.isGitPushStatus(); + return user.getGitPushStatus(); } public Long getUserId() { diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/ResetPasswordRequest.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/ResetPasswordRequest.java deleted file mode 100644 index e3282136..00000000 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/ResetPasswordRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.ezcode.codetest.application.usermanagement.auth.dto.request; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class ResetPasswordRequest { - private String email; - private String newPassword; - private String token; -} diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/SignupRequest.java b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/SignupRequest.java index 50454a95..2b494f78 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/SignupRequest.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/SignupRequest.java @@ -38,11 +38,6 @@ public class SignupRequest { @Size(max = 15, message = "이름은 15글자 이하로 입력 가능합니다") private String username; - @Schema(description = "사용자 별명 (최대 20자)", example = "다람쥐쳇바퀴에굴러가") - @NotBlank(message = "별명은 반드시 입력되어야합니다") - @Size(max = 20, message = "별명은 20글자 이하로 입력 가능합니다") - private String nickname; - //선택적 입력 @Schema(description = "나이 (선택 입력)", example = "25") private Integer age; 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 index 93d76bc7..9f8f2b8b 100644 --- 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 @@ -5,9 +5,12 @@ @Schema(description = "이메일 인증 번호 입력 응답") public record VerifyEmailCodeResponse( @Schema(description = "인증 번호 성공 응답 메세지") - String message + String message, + + @Schema(description = "인증 성공 여부 true/false") + boolean result ) { - public static VerifyEmailCodeResponse from(String message) { - return new VerifyEmailCodeResponse(message); + public static VerifyEmailCodeResponse from(String message, boolean result) { + return new VerifyEmailCodeResponse(message, result); } } 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 0e1e453e..cc3d6c71 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 @@ -4,7 +4,6 @@ import java.util.concurrent.TimeUnit; import org.ezcode.codetest.application.usermanagement.auth.dto.request.FindPasswordRequest; -import org.ezcode.codetest.application.usermanagement.auth.dto.request.ResetPasswordRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.response.FindPasswordResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.response.RefreshTokenResponse; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SigninRequest; @@ -13,7 +12,10 @@ 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.request.ResetPasswordRequest; +import org.ezcode.codetest.application.usermanagement.user.dto.response.ChangeUserPasswordResponse; import org.ezcode.codetest.application.usermanagement.user.dto.response.LogoutResponse; +import org.ezcode.codetest.application.usermanagement.user.dto.response.VerifyFindPasswordResponse; 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; @@ -77,11 +79,12 @@ private void userRegisterationProcess(SignupRequest request) { //3. 만약 아예 첫 가입 유저일 때 private void createNewUser(SignupRequest request, String encodedPassword) { + String nickname = userDomainService.generateUniqueNickname(); User newUser = User.emailUser( request.getEmail(), encodedPassword, request.getUsername(), - request.getNickname(), + nickname, request.getAge() ); @@ -113,7 +116,7 @@ public VerifyEmailCodeResponse verifyEmailCode(String email, String key) { if (isMatch){ user.setVerified(); - return VerifyEmailCodeResponse.from("인증되었습니다"); + return VerifyEmailCodeResponse.from("인증되었습니다", isMatch); } else { throw new UserException(UserExceptionCode.NOT_MATCH_CODE); } @@ -228,22 +231,38 @@ public FindPasswordResponse findPassword(FindPasswordRequest request) { mailService.sendPasswordMail(user.getId(), request.getEmail(), request.getRedirectUrl()); - return FindPasswordResponse.from("이메일로 전송되었습니다."); + return FindPasswordResponse.from("이메일 전송되었습니다."); } - //메일로 받은 링크를 통해 비번 변경 - public FindPasswordResponse resetPassword(ResetPasswordRequest request) { + public VerifyFindPasswordResponse verifyFindPassword(String email, String key) { - User user = userDomainService.getUserByEmail(request.getEmail()); + User user = userDomainService.getUserByEmail(email); + + boolean isMatch = mailService.verifyPasswordCode(user.getId(), key); - boolean isMatch = mailService.verifyPasswordCode(user.getId(), request.getToken()); + String tempResetToken = jwtUtil.createEmailToken(user.getId(), email); if (isMatch){ - String encodedPassword = userDomainService.encodePassword(request.getNewPassword()); - user.modifyPassword(encodedPassword); - return FindPasswordResponse.from("비밀번호가 변경되었습니다."); + user.setVerified(); + return VerifyFindPasswordResponse.from("인증되었습니다", tempResetToken); } else { throw new UserException(UserExceptionCode.NOT_MATCH_CODE); } } + + @Transactional + public ChangeUserPasswordResponse resetPassword(@Valid ResetPasswordRequest request) { + Long userId = jwtUtil.getUserId(request.tempResetToken()); + log.info("요청 유저 id : {}", userId); + + User user = userDomainService.getUserById(userId); + //기존과 같은 비밀번호일때 + userDomainService.passwordComparison(request.newPassword(), user.getPassword()); + if (!request.newPassword().equals(request.newPasswordConfirm())){ + throw new AuthException(AuthExceptionCode.PASSWORD_NOT_MATCH); + } + String encodedPassword = userDomainService.encodePassword(request.newPassword()); + user.modifyPassword(encodedPassword); + return new ChangeUserPasswordResponse("비밀번호 변경이 완료되었습니다."); + } } diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/request/ResetPasswordRequest.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/request/ResetPasswordRequest.java new file mode 100644 index 00000000..8cfb5fab --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/request/ResetPasswordRequest.java @@ -0,0 +1,20 @@ +package org.ezcode.codetest.application.usermanagement.user.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "비밀번호 리셋을 위한 입력") +public record ResetPasswordRequest ( + @Schema(description = "비밀번호 리셋 유저의 토큰 - 유효 시간 10분") + String tempResetToken, + + @Schema(description = "변경할 비밀번호", example = "myPassword@@!") + String newPassword, + + @Schema(description = "변경할 비밀번호 확인용 재입력", example = "myPassword@@!") + String newPasswordConfirm +){ + public static ResetPasswordRequest from(String tempResetToken, String newPassword, String newPasswordConfirm) { + return new ResetPasswordRequest(tempResetToken, newPassword, newPasswordConfirm); + } +} + diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserGitubAutoPushResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserGitubAutoPushResponse.java new file mode 100644 index 00000000..ad3b9f87 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserGitubAutoPushResponse.java @@ -0,0 +1,15 @@ +package org.ezcode.codetest.application.usermanagement.user.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +@Schema(description = "깃허브 자동 Push 여부 변경 후 응답") +public class UserGitubAutoPushResponse { + @Schema(description = "메세지", example = "변경되었습니다") + private final String message; + @Schema(description = "현재 상태", example = "true") + private final boolean gitPushStatus; +} diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java index 4e2e442b..4c4bc71e 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java @@ -41,9 +41,12 @@ public class UserInfoResponse { @Schema(description = "사용자 티어", example = "GOLD") private final Tier tier; + @Schema(description = "인증 여부", example = "true") + private final boolean verified; + @Builder public UserInfoResponse(String username, String email, String nickname, UserRole userRole, Tier tier, - Integer age, String githubUrl, String blogUrl, String profileImageUrl, String introduction) { + Integer age, String githubUrl, String blogUrl, String profileImageUrl, String introduction, boolean verified) { this.username = username; this.email = email; this.nickname = nickname; @@ -54,7 +57,8 @@ public UserInfoResponse(String username, String email, String nickname, UserRole this.introduction = introduction; this.tier = tier; this.userRole = userRole; - } + this.verified = verified; + } public static UserInfoResponse fromEntity(User user) { return UserInfoResponse.builder() diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/VerifyFindPasswordResponse.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/VerifyFindPasswordResponse.java new file mode 100644 index 00000000..ce5534c0 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/VerifyFindPasswordResponse.java @@ -0,0 +1,16 @@ +package org.ezcode.codetest.application.usermanagement.user.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "비밀번호 찾기 인증 응답") +public record VerifyFindPasswordResponse( + @Schema(description = "인증 번호 성공 응답 메세지") + String message, + + @Schema(description = "인증 성공 후 발급, 유저 정보를 담은 토큰(email, userId), 유효시간 10분") + String tempResetToken +) { + public static VerifyFindPasswordResponse from(String message, String tempResetToken) { + return new VerifyFindPasswordResponse(message, tempResetToken); + } +} 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 a0a9010d..dc1768ef 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 @@ -52,6 +52,7 @@ public UserInfoResponse getUserInfo(AuthUser authUser) { .githubUrl(user.getGithubUrl()) .userRole(user.getRole()) .tier(user.getTier()) + .verified(user.isVerified()) .build(); } diff --git a/src/main/java/org/ezcode/codetest/common/security/util/JwtUtil.java b/src/main/java/org/ezcode/codetest/common/security/util/JwtUtil.java index 35890326..7cf02b94 100644 --- a/src/main/java/org/ezcode/codetest/common/security/util/JwtUtil.java +++ b/src/main/java/org/ezcode/codetest/common/security/util/JwtUtil.java @@ -148,4 +148,23 @@ public boolean validateToken(String refreshToken) { return false; } } + + public String createEmailToken(Long userId, String email) { + if ( email == null ) { + throw new IllegalArgumentException("토큰에 필요한 필수 매개변수가 null입니다."); + } + + Date date = new Date(); + long EXPIRATION_TIME = 600 * 1000; // 10분 + + return BEARER_PREFIX + + Jwts.builder() + .setSubject(String.valueOf(userId)) + .claim("email", email) + .setExpiration(new Date(date.getTime() + EXPIRATION_TIME)) + .setIssuedAt(date) + .signWith(key, signatureAlgorithm) + .compact(); + } + } 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 27360b07..e63a4a61 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 @@ -185,8 +185,15 @@ public void setGithubUrl(String githubUrl){ this.githubUrl = githubUrl; } - public void decreaseReviewToken() { this.reviewToken -= 1; } + + public void setGitPushStatus(boolean gitPushStatus) { + this.gitPushStatus = gitPushStatus; + } + + public boolean getGitPushStatus() { + return gitPushStatus; + } } 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 f02024bf..683149cc 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 @@ -81,7 +81,7 @@ public MimeMessage CreatePasswordMail(Long userId, String email, String redirect String body = ""; body += "

" + "아래 버튼을 클릭하여 비밀번호 변경을 완료해 주세요" + "

"; // 이메일 버튼 - body += "비밀번호 변경하기"; + body += "비밀번호 변경하기"; body += "

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

"; message.setText(body,"UTF-8", "html"); } catch (MessagingException e) { diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java index b64ee7af..1fafd203 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java @@ -32,7 +32,6 @@ public class UserDomainService { private final UserRepository userRepository; private final UserAuthTypeRepository userAuthTypeRepository; - private final UserGithubInfoRepository userGithubInfoRepository; private final PasswordEncoder passwordEncoder; private static final java.util.Random RANDOM = new java.util.Random(); diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/UserGithubService.java b/src/main/java/org/ezcode/codetest/domain/user/service/UserGithubService.java index 60782368..1f8eea80 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/UserGithubService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/UserGithubService.java @@ -6,10 +6,12 @@ import org.ezcode.codetest.application.usermanagement.user.dto.request.UserGithubRepoSelectRequest; import org.ezcode.codetest.application.usermanagement.user.dto.response.UserGithubRepoResponse; +import org.ezcode.codetest.application.usermanagement.user.dto.response.UserGitubAutoPushResponse; import org.ezcode.codetest.common.security.util.AESUtil; import org.ezcode.codetest.domain.user.exception.UserException; 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.entity.UserGithubInfo; import org.ezcode.codetest.domain.user.repository.UserGithubInfoRepository; import org.springframework.core.ParameterizedTypeReference; @@ -20,8 +22,10 @@ import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +@Slf4j @Service @RequiredArgsConstructor public class UserGithubService { @@ -100,8 +104,26 @@ public UserGithubRepoResponse selectGithubRepo(AuthUser authUser, UserGithubRepo .orElseThrow(() -> new UserException(UserExceptionCode.NO_GITHUB_REPO)); userGithub.setGithubRepo(request.repositoryName(), selectedRepo.getDefaultBranch()); + userGithubInfoRepository.updateGithubInfo(userGithub); + User user = userGithub.getUser(); + user.setGitPushStatus(true); //레포를 선택하면 자동으로 push 설정이 true + return selectedRepo; } + + @Transactional + public UserGitubAutoPushResponse changeAutoPushSetting(AuthUser authUser) { + UserGithubInfo userGithubInfo = userGithubInfoRepository.getUserGithubInfo(authUser.getId()); + if (userGithubInfo == null) { //유저의 깃허브 정보가 없으면 에러 반환 + throw new UserException(UserExceptionCode.NO_GITHUB_INFO); + } + User user = userGithubInfo.getUser(); + boolean userGitPushStatus = user.getGitPushStatus(); + user.setGitPushStatus(!userGitPushStatus); + log.info("기존 status: {} || 변경 status : {}", userGitPushStatus, user.getGitPushStatus()); + + return new UserGitubAutoPushResponse("변경되었습니다", user.getGitPushStatus()); + } } 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 e088a514..cae9ac19 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java @@ -2,17 +2,11 @@ import java.util.Optional; -import org.ezcode.codetest.application.usermanagement.auth.dto.request.FindPasswordRequest; -import org.ezcode.codetest.application.usermanagement.auth.dto.request.ResetPasswordRequest; -import org.ezcode.codetest.application.usermanagement.auth.dto.request.SendEmailRequest; -import org.ezcode.codetest.application.usermanagement.auth.dto.response.FindPasswordResponse; 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.SendEmailResponse; 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; @@ -21,11 +15,9 @@ import org.springframework.http.HttpStatus; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; @@ -83,37 +75,4 @@ public ResponseEntity refresh(HttpServletRequest request) return ResponseEntity.status(HttpStatus.OK).body(authService.refreshToken(token)); } - @Operation(summary = "이메일 인증 코드 전송", description = "현재 로그인된 회원의 이메일로 인증 코드를 전송합니다.") - @PostMapping("/email/send") - public ResponseEntity sendMailCode( - @AuthenticationPrincipal AuthUser authUser, - @RequestBody SendEmailRequest request - ){ - return ResponseEntity.status(HttpStatus.CREATED).body(authService.sendEmailCode(authUser.getId(), authUser.getEmail(), request.getRedirectUrl())); - } - - //이메일에서 버튼 클릭하면 자동으로 연결 - @Operation(summary = "이메일 코드 입력 및 인증", description = "이메일로 받은 코드를 입력하여 이메일 인증된 회원으로 전환합니다") - @GetMapping("/auth/verify") - public ResponseEntity verifyEmailCode( - @RequestParam String email, - @RequestParam String key - ){ - return ResponseEntity.status(HttpStatus.OK).body(authService.verifyEmailCode(email, key)); - } - - //미완성 -> 메일 전송까지는 성공 - @PostMapping("/auth/find-password") - public ResponseEntity findPassword( - @RequestBody FindPasswordRequest request - ){ - return ResponseEntity.status(HttpStatus.OK).body(authService.findPassword(request)); - } - - @PostMapping("/auth/reset-password") - public ResponseEntity resetPassword( - @RequestBody ResetPasswordRequest request - ){ - return ResponseEntity.status(HttpStatus.OK).body(authService.resetPassword(request)); - } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserGithubController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserGithubController.java index f40b917f..1fedf951 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserGithubController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserGithubController.java @@ -4,6 +4,7 @@ import org.ezcode.codetest.application.usermanagement.user.dto.request.UserGithubRepoSelectRequest; import org.ezcode.codetest.application.usermanagement.user.dto.response.UserGithubRepoResponse; +import org.ezcode.codetest.application.usermanagement.user.dto.response.UserGitubAutoPushResponse; import org.ezcode.codetest.domain.user.model.entity.AuthUser; import org.ezcode.codetest.domain.user.service.UserGithubService; import org.springframework.http.HttpStatus; @@ -11,6 +12,7 @@ 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.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -44,4 +46,12 @@ public ResponseEntity selectGithubRepo( ) throws Exception { return ResponseEntity.status(HttpStatus.OK).body(userGithubService.selectGithubRepo(authUser, reqeust)); } + + @Operation(summary = "깃허브 자동 push 기능 여부 선택", description = "깃허브 자동 push 기능 여부를 킬건지 말건지 선택합니다.(true/false)") + @PutMapping("/users/github") + public ResponseEntity changeAutoPushSetting( + @AuthenticationPrincipal AuthUser authUser + ){ + return ResponseEntity.status(HttpStatus.OK).body(userGithubService.changeAutoPushSetting(authUser)); + } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java new file mode 100644 index 00000000..7b2b640a --- /dev/null +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java @@ -0,0 +1,83 @@ +package org.ezcode.codetest.presentation.usermanagement; + +import org.ezcode.codetest.application.usermanagement.auth.dto.request.FindPasswordRequest; +import org.ezcode.codetest.application.usermanagement.user.dto.request.ResetPasswordRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.request.SendEmailRequest; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.FindPasswordResponse; +import org.ezcode.codetest.application.usermanagement.auth.dto.response.SendEmailResponse; +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.ChangeUserPasswordResponse; +import org.ezcode.codetest.application.usermanagement.user.dto.response.VerifyFindPasswordResponse; +import org.ezcode.codetest.domain.user.model.entity.AuthUser; +import org.springframework.http.HttpStatus; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +@Tag(name = "이메일, 비밀번호 관련 인증 API", description = "이메일 전송을 통한 인증 회원 만들기(verified), 비밀번호 찾기 기능") +public class UserVerifyController { + private final AuthService authService; + + @Operation(summary = "이메일 인증 코드 전송", description = "현재 로그인된 회원의 이메일로 인증 코드를 전송합니다.") + @PostMapping("/email/send") + public ResponseEntity sendMailCode( + @AuthenticationPrincipal AuthUser authUser, + @RequestBody SendEmailRequest request + ){ + return ResponseEntity.status(HttpStatus.CREATED).body(authService.sendEmailCode(authUser.getId(), authUser.getEmail(), request.getRedirectUrl())); + } + + //이메일에서 버튼 클릭하면 자동으로 연결 + @Operation(summary = "이메일 코드 입력 및 인증", description = "이메일로 받은 코드를 입력하여 이메일 인증된 회원으로 전환합니다") + @GetMapping("/auth/verify") + public ResponseEntity verifyEmailCode( + @RequestParam String email, + @RequestParam String key + ){ + return ResponseEntity.status(HttpStatus.OK).body(authService.verifyEmailCode(email, key)); + } + + + //비밀번호 찾기 요청 + @Operation(summary = "비밀번호 찾기 요청", description = "비밀번호를 찾기 위해 이메일로 인증코드를 전송합니다.") + @PostMapping("/auth/find-password") + public ResponseEntity findPassword( + @RequestBody FindPasswordRequest request + ){ + return ResponseEntity.status(HttpStatus.OK).body(authService.findPassword(request)); + } + + @Operation(summary = "비밀번호 찾기 요청 이메일 코드 인증", description = "비밀번호 찾기로 받은 이메일에서 '인증하기' 버튼을 누르면 자동으로 호출되는 api") + @GetMapping("/auth/find-password-verify") + public ResponseEntity verifyFindPassword( + @RequestParam String email, + @RequestParam String key + ){ + return ResponseEntity.status(HttpStatus.OK).body(authService.verifyFindPassword(email, key)); + } + + @Operation(summary = "비밀번호 찾기 후 비밀번호 변경", description = "비밀번호 찾기를 통해 인증한 회원의 비밀번호 변경") + @PostMapping("/auth/reset-password") + public ResponseEntity resetPassword( + @Valid @RequestBody ResetPasswordRequest request + ){ + return ResponseEntity.status(HttpStatus.OK).body(authService.resetPassword(request)); + } + +}