Skip to content

Commit 8f83d69

Browse files
authored
Merge pull request #24 from Block-Guard/feat/#23/check-email
[Feat] 이메일 중복 확인 API
2 parents 9d36208 + 3711f2e commit 8f83d69

File tree

8 files changed

+82
-11
lines changed

8 files changed

+82
-11
lines changed

src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.blockguard.server.domain.auth.api;
22

33
import com.blockguard.server.domain.auth.application.AuthService;
4-
import com.blockguard.server.domain.user.dto.request.FindEmailRequest;
5-
import com.blockguard.server.domain.user.dto.request.FindPasswordRequest;
6-
import com.blockguard.server.domain.user.dto.request.LoginRequest;
7-
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
4+
import com.blockguard.server.domain.user.dto.request.*;
5+
import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse;
86
import com.blockguard.server.domain.user.dto.response.FindEmailResponse;
97
import com.blockguard.server.domain.user.dto.response.LoginResponse;
108
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
@@ -36,6 +34,15 @@ public ResponseEntity<BaseResponse<RegisterResponse>> register(@Valid @RequestBo
3634

3735
}
3836

37+
@Operation(summary = "이메일 중복 확인", description = "true 반환 시, 이메일 중복")
38+
@CustomExceptionDescription(SwaggerResponseDescription.CHECK_EMAIL_DUPLICATED_FAIL)
39+
@PostMapping("/register/check-email")
40+
public ResponseEntity<BaseResponse<CheckEmailDuplicatedResponse>> checkEmailDuplicated(@Valid @RequestBody CheckEmailDuplicatedRequest CheckEmailDuplicatedRequest) {
41+
CheckEmailDuplicatedResponse checkEmailResponse = authService.checkEmailDuplicated(CheckEmailDuplicatedRequest);
42+
return ResponseEntity.ok(BaseResponse.of(SuccessCode.CHECK_EMAIL_DUPLICATED, checkEmailResponse));
43+
44+
}
45+
3946

4047
@Operation(summary = "로그인")
4148
@CustomExceptionDescription(SwaggerResponseDescription.LOGIN_FAIL)
@@ -48,15 +55,15 @@ public ResponseEntity<BaseResponse<LoginResponse>> login(@RequestBody LoginReque
4855
@Operation(summary = "아이디 찾기")
4956
@CustomExceptionDescription(SwaggerResponseDescription.FIND_EMAIL_FAIL)
5057
@PostMapping("find-email")
51-
public ResponseEntity<BaseResponse<FindEmailResponse>> findEmail(@RequestBody @Valid FindEmailRequest findEmailRequest){
58+
public ResponseEntity<BaseResponse<FindEmailResponse>> findEmail(@RequestBody @Valid FindEmailRequest findEmailRequest) {
5259
FindEmailResponse findEmailResponse = authService.findEmail(findEmailRequest);
5360
return ResponseEntity.ok(BaseResponse.of(SuccessCode.USER_EMAIL_FOUND, findEmailResponse));
5461
}
5562

5663
@Operation(summary = "비밀번호 찾기", description = "이메일이 유효하면 해당 이메일로 임시 비밀번호를 발송합니다.")
5764
@CustomExceptionDescription(SwaggerResponseDescription.FIND_PASSWORD_FAIL)
5865
@PostMapping("find-password")
59-
public ResponseEntity<BaseResponse<Void>> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest){
66+
public ResponseEntity<BaseResponse<Void>> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest) {
6067
authService.sendTempPassword(findPasswordRequest);
6168
return ResponseEntity.ok(BaseResponse.of(SuccessCode.SEND_TEMP_PASSWORD_BY_EMAIL));
6269
}

src/main/java/com/blockguard/server/domain/auth/application/AuthService.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import com.blockguard.server.domain.auth.domain.JwtToken;
44
import com.blockguard.server.domain.auth.infra.JwtTokenGenerator;
55
import com.blockguard.server.domain.user.domain.User;
6-
import com.blockguard.server.domain.user.dto.request.FindEmailRequest;
7-
import com.blockguard.server.domain.user.dto.request.FindPasswordRequest;
8-
import com.blockguard.server.domain.user.dto.request.LoginRequest;
6+
import com.blockguard.server.domain.user.dto.request.*;
97
import com.blockguard.server.domain.user.dao.UserRepository;
10-
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
8+
import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse;
119
import com.blockguard.server.domain.user.dto.response.FindEmailResponse;
1210
import com.blockguard.server.domain.user.dto.response.LoginResponse;
1311
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
@@ -53,6 +51,14 @@ public RegisterResponse register(RegisterRequest registerRequest) {
5351
.build();
5452
}
5553

54+
55+
public CheckEmailDuplicatedResponse checkEmailDuplicated(CheckEmailDuplicatedRequest checkEmailDuplicatedRequest) {
56+
boolean isDuplicated = userRepository.findByEmail(checkEmailDuplicatedRequest.getEmail()).isPresent();
57+
return CheckEmailDuplicatedResponse.builder()
58+
.isDuplicated(isDuplicated)
59+
.build();
60+
}
61+
5662
public LoginResponse login(LoginRequest loginRequest) {
5763
User user = userRepository.findByEmail(loginRequest.getEmail())
5864
.orElseThrow(() -> new BusinessExceptionHandler(ErrorCode.INVALID_EMAIL));
@@ -135,4 +141,5 @@ private String generateTempPassword() {
135141

136142
return finalPassword.toString();
137143
}
144+
138145
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.blockguard.server.domain.user.dto.request;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.NotBlank;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class CheckEmailDuplicatedRequest {
11+
@Email
12+
@NotBlank
13+
private String email;
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.blockguard.server.domain.user.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class CheckEmailDuplicatedResponse {
13+
private boolean isDuplicated;
14+
}

src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
@AllArgsConstructor
99
public enum ErrorCode {
1010
/// 4000 ~ : client error
11+
INVALID_REQUEST(HttpStatus.BAD_REQUEST, 4000, "잘못된 요청 형식입니다. 입력값을 확인해주세요."),
1112
DUPLICATED_EMAIL(HttpStatus.BAD_REQUEST, 4001, "이미 가입된 이메일입니다."),
1213
INVALID_EMAIL(HttpStatus.BAD_REQUEST, 4002, "존재하지 않는 이메일입니다."),
1314
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, 4003, "비밀번호가 일치하지 않습니다."),
@@ -24,6 +25,7 @@ public enum ErrorCode {
2425
INVALID_DIRECTORY_ROUTE(HttpStatus.NOT_FOUND, 4022, "잘못된 디렉토리 경로입니다."),
2526
FILE_SIZE_EXCEEDED(HttpStatus.PAYLOAD_TOO_LARGE, 4023, "프로필 파일 최대 허용 용량(5MB)을 초과했습니다."),
2627
DUPLICATE_GUARDIAN_NAME(HttpStatus.BAD_REQUEST, 4024, "이미 등록된 보호자 이름입니다."),
28+
INVALID_EMAIL_TYPE(HttpStatus.BAD_REQUEST, 4025, "이메일 형식이 올바르지 않습니다."),
2729

2830
// 5000~ : server error
2931
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000, "서버 오류가 발생했습니다.");

src/main/java/com/blockguard/server/global/common/codes/SuccessCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public enum SuccessCode {
2121
GUARDIAN_LIST_RETRIEVED(HttpStatus.OK, 2010, "보호자 목록 조회가 완료되었습니다."),
2222
GUARDIAN_UPDATED(HttpStatus.OK, 2011, "보호자 정보 수정이 완료되었습니다."),
2323
GUARDIAN_PRIMARY_UPDATED(HttpStatus.OK, 2012, "보호자 정보 수정이 완료되었습니다."),
24-
GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다.");
24+
GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다."),
25+
CHECK_EMAIL_DUPLICATED(HttpStatus.OK, 2014, "이메일 중복 확인이 완료되었습니다.");
2526

2627
private final HttpStatus status;
2728
private final int code;

src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public enum SwaggerResponseDescription {
5858

5959
UPDATE_GUARDIAN_PRIMARY_FAIL(new LinkedHashSet<>(Set.of(
6060
ErrorCode.GUARDIAN_NOT_FOUND
61+
))),
62+
63+
CHECK_EMAIL_DUPLICATED_FAIL(new LinkedHashSet<>(Set.of(
64+
ErrorCode.INVALID_EMAIL_TYPE
6165
)));
6266

6367
private final Set<ErrorCode> errorCodeList;

src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.blockguard.server.global.common.codes.ErrorCode;
44
import com.blockguard.server.global.common.response.ErrorResponse;
55
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.context.support.DefaultMessageSourceResolvable;
67
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.MethodArgumentNotValidException;
79
import org.springframework.web.bind.annotation.ExceptionHandler;
810
import org.springframework.web.bind.annotation.RestControllerAdvice;
911
import org.springframework.web.multipart.MaxUploadSizeExceededException;
@@ -21,6 +23,26 @@ protected ResponseEntity<ErrorResponse> handleCustomException(BusinessExceptionH
2123
.body(ErrorResponse.of(errorCode));
2224
}
2325

26+
@ExceptionHandler(MethodArgumentNotValidException.class)
27+
protected ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
28+
String message = ex.getBindingResult().getFieldErrors().stream()
29+
.findFirst()
30+
.map(DefaultMessageSourceResolvable::getDefaultMessage)
31+
.orElse("유효성 검사에 실패했습니다.");
32+
33+
log.warn("[ValidationException] message: {}", message);
34+
35+
if (message.contains("이메일 형식")) {
36+
return ResponseEntity
37+
.status(ErrorCode.INVALID_EMAIL_TYPE.getStatus())
38+
.body(ErrorResponse.of(ErrorCode.INVALID_EMAIL_TYPE));
39+
}
40+
41+
return ResponseEntity
42+
.status(ErrorCode.INVALID_REQUEST.getStatus())
43+
.body(ErrorResponse.of(ErrorCode.INVALID_REQUEST, message));
44+
}
45+
2446
@ExceptionHandler(MaxUploadSizeExceededException.class)
2547
protected ResponseEntity<ErrorResponse> handleMaxUploadSize(MaxUploadSizeExceededException maxUploadSizeExceededException) {
2648
log.error("[MaxUploadSizeExceeded] message: {}", maxUploadSizeExceededException.getMessage());

0 commit comments

Comments
 (0)