Skip to content

Commit a77f542

Browse files
minjee2758NCookies
authored andcommitted
Feature : 깃허브 자동 push on/off 기능, 비밀번호 찾기(리셋) 기능 구현, 유저 정보 조회 verified 필드 추가, 이메일 발송 컨트롤러 분리 (#118)
* refactor: 유저 정보 가져오는 api에 verified 여부 추가 * feature : 깃허브 자동 push 여부 선택 api 추가 * refactor : 이메일 발송 관련 api controller 분리 * refactor : 비밀번호 찾기 기능 - 이메일 인증 과정 * feature : 비밀번호 리셋 기능 추가 * 비밀번호 변경 시 예외 상황 추가 * 일반 회원가입도 랜덤 닉네임 부여
1 parent ddb00bc commit a77f542

File tree

18 files changed

+238
-78
lines changed

18 files changed

+238
-78
lines changed

src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void incrementCorrectSubmissions() {
139139
}
140140

141141
public boolean isGitPushStatus() {
142-
return user.isGitPushStatus();
142+
return user.getGitPushStatus();
143143
}
144144

145145
public Long getUserId() {

src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/ResetPasswordRequest.java

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/request/SignupRequest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ public class SignupRequest {
3838
@Size(max = 15, message = "이름은 15글자 이하로 입력 가능합니다")
3939
private String username;
4040

41-
@Schema(description = "사용자 별명 (최대 20자)", example = "다람쥐쳇바퀴에굴러가")
42-
@NotBlank(message = "별명은 반드시 입력되어야합니다")
43-
@Size(max = 20, message = "별명은 20글자 이하로 입력 가능합니다")
44-
private String nickname;
45-
4641
//선택적 입력
4742
@Schema(description = "나이 (선택 입력)", example = "25")
4843
private Integer age;

src/main/java/org/ezcode/codetest/application/usermanagement/auth/dto/response/VerifyEmailCodeResponse.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
@Schema(description = "이메일 인증 번호 입력 응답")
66
public record VerifyEmailCodeResponse(
77
@Schema(description = "인증 번호 성공 응답 메세지")
8-
String message
8+
String message,
9+
10+
@Schema(description = "인증 성공 여부 true/false")
11+
boolean result
912
) {
10-
public static VerifyEmailCodeResponse from(String message) {
11-
return new VerifyEmailCodeResponse(message);
13+
public static VerifyEmailCodeResponse from(String message, boolean result) {
14+
return new VerifyEmailCodeResponse(message, result);
1215
}
1316
}

src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.concurrent.TimeUnit;
55

66
import org.ezcode.codetest.application.usermanagement.auth.dto.request.FindPasswordRequest;
7-
import org.ezcode.codetest.application.usermanagement.auth.dto.request.ResetPasswordRequest;
87
import org.ezcode.codetest.application.usermanagement.auth.dto.response.FindPasswordResponse;
98
import org.ezcode.codetest.application.usermanagement.auth.dto.response.RefreshTokenResponse;
109
import org.ezcode.codetest.application.usermanagement.auth.dto.request.SigninRequest;
@@ -13,7 +12,10 @@
1312
import org.ezcode.codetest.application.usermanagement.auth.dto.request.SignupRequest;
1413
import org.ezcode.codetest.application.usermanagement.auth.dto.response.SignupResponse;
1514
import org.ezcode.codetest.application.usermanagement.auth.dto.response.VerifyEmailCodeResponse;
15+
import org.ezcode.codetest.application.usermanagement.user.dto.request.ResetPasswordRequest;
16+
import org.ezcode.codetest.application.usermanagement.user.dto.response.ChangeUserPasswordResponse;
1617
import org.ezcode.codetest.application.usermanagement.user.dto.response.LogoutResponse;
18+
import org.ezcode.codetest.application.usermanagement.user.dto.response.VerifyFindPasswordResponse;
1719
import org.ezcode.codetest.domain.user.exception.AuthException;
1820
import org.ezcode.codetest.domain.user.exception.UserException;
1921
import org.ezcode.codetest.domain.user.exception.code.AuthExceptionCode;
@@ -77,11 +79,12 @@ private void userRegisterationProcess(SignupRequest request) {
7779

7880
//3. 만약 아예 첫 가입 유저일 때
7981
private void createNewUser(SignupRequest request, String encodedPassword) {
82+
String nickname = userDomainService.generateUniqueNickname();
8083
User newUser = User.emailUser(
8184
request.getEmail(),
8285
encodedPassword,
8386
request.getUsername(),
84-
request.getNickname(),
87+
nickname,
8588
request.getAge()
8689
);
8790

@@ -113,7 +116,7 @@ public VerifyEmailCodeResponse verifyEmailCode(String email, String key) {
113116

114117
if (isMatch){
115118
user.setVerified();
116-
return VerifyEmailCodeResponse.from("인증되었습니다");
119+
return VerifyEmailCodeResponse.from("인증되었습니다", isMatch);
117120
} else {
118121
throw new UserException(UserExceptionCode.NOT_MATCH_CODE);
119122
}
@@ -228,22 +231,38 @@ public FindPasswordResponse findPassword(FindPasswordRequest request) {
228231

229232
mailService.sendPasswordMail(user.getId(), request.getEmail(), request.getRedirectUrl());
230233

231-
return FindPasswordResponse.from("이메일로 전송되었습니다.");
234+
return FindPasswordResponse.from("이메일 전송되었습니다.");
232235
}
233236

234-
//메일로 받은 링크를 통해 비번 변경
235-
public FindPasswordResponse resetPassword(ResetPasswordRequest request) {
237+
public VerifyFindPasswordResponse verifyFindPassword(String email, String key) {
236238

237-
User user = userDomainService.getUserByEmail(request.getEmail());
239+
User user = userDomainService.getUserByEmail(email);
240+
241+
boolean isMatch = mailService.verifyPasswordCode(user.getId(), key);
238242

239-
boolean isMatch = mailService.verifyPasswordCode(user.getId(), request.getToken());
243+
String tempResetToken = jwtUtil.createEmailToken(user.getId(), email);
240244

241245
if (isMatch){
242-
String encodedPassword = userDomainService.encodePassword(request.getNewPassword());
243-
user.modifyPassword(encodedPassword);
244-
return FindPasswordResponse.from("비밀번호가 변경되었습니다.");
246+
user.setVerified();
247+
return VerifyFindPasswordResponse.from("인증되었습니다", tempResetToken);
245248
} else {
246249
throw new UserException(UserExceptionCode.NOT_MATCH_CODE);
247250
}
248251
}
252+
253+
@Transactional
254+
public ChangeUserPasswordResponse resetPassword(@Valid ResetPasswordRequest request) {
255+
Long userId = jwtUtil.getUserId(request.tempResetToken());
256+
log.info("요청 유저 id : {}", userId);
257+
258+
User user = userDomainService.getUserById(userId);
259+
//기존과 같은 비밀번호일때
260+
userDomainService.passwordComparison(request.newPassword(), user.getPassword());
261+
if (!request.newPassword().equals(request.newPasswordConfirm())){
262+
throw new AuthException(AuthExceptionCode.PASSWORD_NOT_MATCH);
263+
}
264+
String encodedPassword = userDomainService.encodePassword(request.newPassword());
265+
user.modifyPassword(encodedPassword);
266+
return new ChangeUserPasswordResponse("비밀번호 변경이 완료되었습니다.");
267+
}
249268
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.ezcode.codetest.application.usermanagement.user.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
@Schema(description = "비밀번호 리셋을 위한 입력")
6+
public record ResetPasswordRequest (
7+
@Schema(description = "비밀번호 리셋 유저의 토큰 - 유효 시간 10분")
8+
String tempResetToken,
9+
10+
@Schema(description = "변경할 비밀번호", example = "myPassword@@!")
11+
String newPassword,
12+
13+
@Schema(description = "변경할 비밀번호 확인용 재입력", example = "myPassword@@!")
14+
String newPasswordConfirm
15+
){
16+
public static ResetPasswordRequest from(String tempResetToken, String newPassword, String newPasswordConfirm) {
17+
return new ResetPasswordRequest(tempResetToken, newPassword, newPasswordConfirm);
18+
}
19+
}
20+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.ezcode.codetest.application.usermanagement.user.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
@Schema(description = "깃허브 자동 Push 여부 변경 후 응답")
10+
public class UserGitubAutoPushResponse {
11+
@Schema(description = "메세지", example = "변경되었습니다")
12+
private final String message;
13+
@Schema(description = "현재 상태", example = "true")
14+
private final boolean gitPushStatus;
15+
}

src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@ public class UserInfoResponse {
4141
@Schema(description = "사용자 티어", example = "GOLD")
4242
private final Tier tier;
4343

44+
@Schema(description = "인증 여부", example = "true")
45+
private final boolean verified;
46+
4447
@Builder
4548
public UserInfoResponse(String username, String email, String nickname, UserRole userRole, Tier tier,
46-
Integer age, String githubUrl, String blogUrl, String profileImageUrl, String introduction) {
49+
Integer age, String githubUrl, String blogUrl, String profileImageUrl, String introduction, boolean verified) {
4750
this.username = username;
4851
this.email = email;
4952
this.nickname = nickname;
@@ -54,7 +57,8 @@ public UserInfoResponse(String username, String email, String nickname, UserRole
5457
this.introduction = introduction;
5558
this.tier = tier;
5659
this.userRole = userRole;
57-
}
60+
this.verified = verified;
61+
}
5862

5963
public static UserInfoResponse fromEntity(User user) {
6064
return UserInfoResponse.builder()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.ezcode.codetest.application.usermanagement.user.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
@Schema(description = "비밀번호 찾기 인증 응답")
6+
public record VerifyFindPasswordResponse(
7+
@Schema(description = "인증 번호 성공 응답 메세지")
8+
String message,
9+
10+
@Schema(description = "인증 성공 후 발급, 유저 정보를 담은 토큰(email, userId), 유효시간 10분")
11+
String tempResetToken
12+
) {
13+
public static VerifyFindPasswordResponse from(String message, String tempResetToken) {
14+
return new VerifyFindPasswordResponse(message, tempResetToken);
15+
}
16+
}

src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public UserInfoResponse getUserInfo(AuthUser authUser) {
5252
.githubUrl(user.getGithubUrl())
5353
.userRole(user.getRole())
5454
.tier(user.getTier())
55+
.verified(user.isVerified())
5556
.build();
5657
}
5758

0 commit comments

Comments
 (0)