Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package com.blockguard.server.domain.auth.api;

import com.blockguard.server.domain.auth.application.AuthService;
import com.blockguard.server.domain.user.dto.request.FindEmailRequest;
import com.blockguard.server.domain.user.dto.request.FindPasswordRequest;
import com.blockguard.server.domain.user.dto.request.LoginRequest;
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
import com.blockguard.server.domain.user.dto.request.*;
import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse;
import com.blockguard.server.domain.user.dto.response.FindEmailResponse;
import com.blockguard.server.domain.user.dto.response.LoginResponse;
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
Expand Down Expand Up @@ -36,6 +34,15 @@ public ResponseEntity<BaseResponse<RegisterResponse>> register(@Valid @RequestBo

}

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

}
Comment thread
chaeyuuu marked this conversation as resolved.


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

@Operation(summary = "비밀번호 찾기", description = "이메일이 유효하면 해당 이메일로 임시 비밀번호를 발송합니다.")
@CustomExceptionDescription(SwaggerResponseDescription.FIND_PASSWORD_FAIL)
@PostMapping("find-password")
public ResponseEntity<BaseResponse<Void>> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest){
public ResponseEntity<BaseResponse<Void>> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest) {
authService.sendTempPassword(findPasswordRequest);
return ResponseEntity.ok(BaseResponse.of(SuccessCode.SEND_TEMP_PASSWORD_BY_EMAIL));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import com.blockguard.server.domain.auth.domain.JwtToken;
import com.blockguard.server.domain.auth.infra.JwtTokenGenerator;
import com.blockguard.server.domain.user.domain.User;
import com.blockguard.server.domain.user.dto.request.FindEmailRequest;
import com.blockguard.server.domain.user.dto.request.FindPasswordRequest;
import com.blockguard.server.domain.user.dto.request.LoginRequest;
import com.blockguard.server.domain.user.dto.request.*;
import com.blockguard.server.domain.user.dao.UserRepository;
import com.blockguard.server.domain.user.dto.request.RegisterRequest;
import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse;
import com.blockguard.server.domain.user.dto.response.FindEmailResponse;
import com.blockguard.server.domain.user.dto.response.LoginResponse;
import com.blockguard.server.domain.user.dto.response.RegisterResponse;
Expand Down Expand Up @@ -53,6 +51,14 @@ public RegisterResponse register(RegisterRequest registerRequest) {
.build();
}


public CheckEmailDuplicatedResponse checkEmailDuplicated(CheckEmailDuplicatedRequest checkEmailDuplicatedRequest) {
boolean isDuplicated = userRepository.findByEmail(checkEmailDuplicatedRequest.getEmail()).isPresent();
return CheckEmailDuplicatedResponse.builder()
.isDuplicated(isDuplicated)
.build();
}

public LoginResponse login(LoginRequest loginRequest) {
User user = userRepository.findByEmail(loginRequest.getEmail())
.orElseThrow(() -> new BusinessExceptionHandler(ErrorCode.INVALID_EMAIL));
Expand Down Expand Up @@ -135,4 +141,5 @@ private String generateTempPassword() {

return finalPassword.toString();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.blockguard.server.domain.user.dto.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CheckEmailDuplicatedRequest {
@Email
@NotBlank
private String email;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.blockguard.server.domain.user.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CheckEmailDuplicatedResponse {
private boolean isDuplicated;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
@AllArgsConstructor
public enum ErrorCode {
/// 4000 ~ : client error
INVALID_REQUEST(HttpStatus.BAD_REQUEST, 4000, "잘못된 요청 형식입니다. 입력값을 확인해주세요."),
DUPLICATED_EMAIL(HttpStatus.BAD_REQUEST, 4001, "이미 가입된 이메일입니다."),
INVALID_EMAIL(HttpStatus.BAD_REQUEST, 4002, "존재하지 않는 이메일입니다."),
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, 4003, "비밀번호가 일치하지 않습니다."),
Expand All @@ -24,6 +25,7 @@ public enum ErrorCode {
INVALID_DIRECTORY_ROUTE(HttpStatus.NOT_FOUND, 4022, "잘못된 디렉토리 경로입니다."),
FILE_SIZE_EXCEEDED(HttpStatus.PAYLOAD_TOO_LARGE, 4023, "프로필 파일 최대 허용 용량(5MB)을 초과했습니다."),
DUPLICATE_GUARDIAN_NAME(HttpStatus.BAD_REQUEST, 4024, "이미 등록된 보호자 이름입니다."),
INVALID_EMAIL_TYPE(HttpStatus.BAD_REQUEST, 4025, "이메일 형식이 올바르지 않습니다."),

// 5000~ : server error
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000, "서버 오류가 발생했습니다.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public enum SuccessCode {
GUARDIAN_LIST_RETRIEVED(HttpStatus.OK, 2010, "보호자 목록 조회가 완료되었습니다."),
GUARDIAN_UPDATED(HttpStatus.OK, 2011, "보호자 정보 수정이 완료되었습니다."),
GUARDIAN_PRIMARY_UPDATED(HttpStatus.OK, 2012, "보호자 정보 수정이 완료되었습니다."),
GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다.");
GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다."),
CHECK_EMAIL_DUPLICATED(HttpStatus.OK, 2014, "이메일 중복 확인이 완료되었습니다.");

private final HttpStatus status;
private final int code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ public enum SwaggerResponseDescription {

UPDATE_GUARDIAN_PRIMARY_FAIL(new LinkedHashSet<>(Set.of(
ErrorCode.GUARDIAN_NOT_FOUND
))),

CHECK_EMAIL_DUPLICATED_FAIL(new LinkedHashSet<>(Set.of(
ErrorCode.INVALID_EMAIL_TYPE
)));

private final Set<ErrorCode> errorCodeList;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import com.blockguard.server.global.common.codes.ErrorCode;
import com.blockguard.server.global.common.response.ErrorResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
Expand All @@ -21,6 +23,26 @@ protected ResponseEntity<ErrorResponse> handleCustomException(BusinessExceptionH
.body(ErrorResponse.of(errorCode));
}

@ExceptionHandler(MethodArgumentNotValidException.class)
protected ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
String message = ex.getBindingResult().getFieldErrors().stream()
.findFirst()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.orElse("유효성 검사에 실패했습니다.");

log.warn("[ValidationException] message: {}", message);

if (message.contains("이메일 형식")) {
return ResponseEntity
.status(ErrorCode.INVALID_EMAIL_TYPE.getStatus())
.body(ErrorResponse.of(ErrorCode.INVALID_EMAIL_TYPE));
}

return ResponseEntity
.status(ErrorCode.INVALID_REQUEST.getStatus())
.body(ErrorResponse.of(ErrorCode.INVALID_REQUEST, message));
}

@ExceptionHandler(MaxUploadSizeExceededException.class)
protected ResponseEntity<ErrorResponse> handleMaxUploadSize(MaxUploadSizeExceededException maxUploadSizeExceededException) {
log.error("[MaxUploadSizeExceeded] message: {}", maxUploadSizeExceededException.getMessage());
Expand Down