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
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.example.plzdrawing.api.auth.controller;

import java.net.URI;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.example.plzdrawing.api.auth.dto.request.LoginRequest;
import org.example.plzdrawing.api.auth.dto.request.SignUpRequest;
Expand All @@ -25,7 +27,7 @@ public class AuthController {
private final TokenService tokenService;

@PostMapping("/v1/signup")
public ResponseEntity<SignUpResponse> signUp(@RequestBody SignUpRequest request) {
public ResponseEntity<SignUpResponse> signUp(@RequestBody @Valid SignUpRequest request) {
AuthService authService = strategyManager.getAuthService(request.getProvider());

Long savedId = authService.signUp(request).getMemberId();
Expand All @@ -38,7 +40,7 @@ public ResponseEntity<SignUpResponse> signUp(@RequestBody SignUpRequest request)
}

@PostMapping("/v1/login")
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
public ResponseEntity<LoginResponse> login(@RequestBody @Valid LoginRequest request) {
AuthService authService = strategyManager.getAuthService(request.getProvider());

return ResponseEntity.ok(authService.login(request));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
package org.example.plzdrawing.api.auth.controller;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Pattern;
import lombok.RequiredArgsConstructor;
import org.example.plzdrawing.api.auth.dto.request.CodeGenerateRequest;
import org.example.plzdrawing.api.auth.dto.request.CodeGenerateForPasswordRequest;
import org.example.plzdrawing.api.auth.dto.request.CodeGenerateRequest;
import org.example.plzdrawing.api.auth.dto.request.PasswordResetRequest;
import org.example.plzdrawing.api.auth.dto.request.UpdatePasswordRequest;
import org.example.plzdrawing.api.auth.service.strategy.email.EmailService;
import org.example.plzdrawing.common.annotation.ValidEmail;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
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 org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
Expand All @@ -23,13 +21,13 @@ public class EmailController {
private final EmailService emailService;

@PostMapping("/v1/email-verification")
public ResponseEntity<Void> sendEmailForVerification(@RequestBody CodeGenerateRequest request) {
public ResponseEntity<Void> sendEmailForVerification(@RequestBody @Valid CodeGenerateRequest request) {
emailService.sendCode(request.getEmail());
return ResponseEntity.ok().build();
}

@GetMapping("/v1/email-verification")
public ResponseEntity<Boolean> verifyEmail(@RequestParam("email") String email,
public ResponseEntity<Boolean> verifyEmail(@RequestParam("email") @ValidEmail String email,
@RequestParam("code") String authCode) {

return ResponseEntity.ok(emailService.verifyAuthCode(email, authCode));
Expand All @@ -44,13 +42,13 @@ public ResponseEntity<Void> sendEmailForReissuePassword(
}

@PatchMapping("/v1/password/reissue")
public ResponseEntity<Boolean> reissuePassword(@RequestBody PasswordResetRequest request) {
public ResponseEntity<Boolean> reissuePassword(@RequestBody @Valid PasswordResetRequest request) {

return ResponseEntity.ok(emailService.reissuePassword(request.getEmail(), request.getAuthCode()));
}

@PatchMapping("/v1/password/update")
public ResponseEntity<Void> updatePassword(@RequestBody UpdatePasswordRequest request) {
public ResponseEntity<Void> updatePassword(@RequestBody @Valid UpdatePasswordRequest request) {

emailService.updatePassword(request.getEmail(), request.getPassword());
return ResponseEntity.ok().build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package org.example.plzdrawing.api.auth.dto.request;

import lombok.Getter;
import org.example.plzdrawing.common.annotation.ValidEmail;

@Getter
public class CodeGenerateForPasswordRequest {

@ValidEmail
private String email;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package org.example.plzdrawing.api.auth.dto.request;

import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.plzdrawing.common.annotation.ValidEmail;

@Getter
@NoArgsConstructor
public class CodeGenerateRequest {

@ValidEmail
private String email;
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package org.example.plzdrawing.api.auth.dto.request;

import lombok.Getter;
import org.example.plzdrawing.common.annotation.ValidEmail;
import org.example.plzdrawing.common.annotation.ValidPassword;
import org.example.plzdrawing.domain.member.Provider;

@Getter
public class LoginRequest {

private Provider provider;

@ValidEmail
private String email;

@ValidPassword
private String password;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package org.example.plzdrawing.api.auth.dto.request;

import lombok.Getter;
import org.example.plzdrawing.common.annotation.ValidEmail;

@Getter
public class PasswordResetRequest {

@ValidEmail
private String email;
private String authCode;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
package org.example.plzdrawing.api.auth.dto.request;

import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import org.example.plzdrawing.common.annotation.ValidEmail;
import org.example.plzdrawing.common.annotation.ValidPassword;
import org.example.plzdrawing.domain.member.Provider;
import org.hibernate.validator.constraints.Length;

@Getter
public class SignUpRequest {

private Provider provider;

@ValidEmail
private String email;

@ValidPassword
private String password;

private String nickName;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package org.example.plzdrawing.api.auth.dto.request;

import lombok.Getter;
import org.example.plzdrawing.common.annotation.ValidEmail;
import org.example.plzdrawing.common.annotation.ValidPassword;

@Getter
public class UpdatePasswordRequest {

@ValidEmail
private String email;

@ValidPassword
private String password;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@

@Getter
@RequiredArgsConstructor
public enum AuthErrorCode {//2
AUTH_CODE_INCORRECT(new BaseErrorCode(4012, HttpStatus.UNAUTHORIZED, "인증번호가 일치하지 않습니다."))
public enum AuthErrorCode{
AUTH_CODE_INCORRECT(new BaseErrorCode("AUTH_001", HttpStatus.UNAUTHORIZED, "인증번호가 일치하지 않습니다."))
;

private final ErrorCode errorCode;
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package org.example.plzdrawing.api.auth.service.strategy.email;

import static org.example.plzdrawing.api.auth.exception.AuthErrorCode.AUTH_CODE_INCORRECT;
import static org.example.plzdrawing.api.member.exception.MemberErrorCode.MEMBER_NOT_FOUND;
import static org.example.plzdrawing.api.member.exception.MemberErrorCode.PASSWORD_INCORRECT;
import org.example.plzdrawing.api.member.exception.MemberErrorCode;

import lombok.RequiredArgsConstructor;
import org.example.plzdrawing.api.auth.dto.request.LoginRequest;
import org.example.plzdrawing.api.auth.dto.request.SignUpRequest;
import org.example.plzdrawing.api.auth.dto.response.LoginResponse;
import org.example.plzdrawing.api.auth.dto.response.SignUpResponse;
import org.example.plzdrawing.api.auth.exception.AuthErrorCode;
import org.example.plzdrawing.api.auth.repository.AuthCodeRedisRepository;
import org.example.plzdrawing.api.auth.service.mail.MailService;
import org.example.plzdrawing.common.exception.RestApiException;
Expand Down Expand Up @@ -36,7 +35,7 @@ public class EmailServiceImpl implements EmailService {
@Override
public LoginResponse login(LoginRequest request) {
Member member = memberRepository.findByEmailAndProvider(request.getEmail(),
request.getProvider()).orElseThrow(()->new RestApiException(MEMBER_NOT_FOUND.getErrorCode()));
request.getProvider()).orElseThrow(()->new RestApiException(MemberErrorCode.MEMBER_NOT_FOUND.getErrorCode()));

validatePassword(request, member);

Expand Down Expand Up @@ -88,7 +87,7 @@ public void sendEmailForRecoveryPassword(String email) {
@Transactional
public Boolean reissuePassword(String email, String authCode) {
if (!verifyReissueAuthCode(email, authCode)) {
throw new RestApiException(AUTH_CODE_INCORRECT.getErrorCode());
throw new RestApiException(AuthErrorCode.AUTH_CODE_INCORRECT.getErrorCode());
}
String password = randomGenerator.generateTemporaryPassword();
updatePassword(email, password);
Expand All @@ -100,7 +99,7 @@ public void updatePassword(String email, String password) {
password = passwordEncoder.encode(password);

Member member = memberRepository.findByEmailAndProvider(email, Provider.EMAIL)
.orElseThrow(() -> new RestApiException(MEMBER_NOT_FOUND.getErrorCode()));
.orElseThrow(() -> new RestApiException(MemberErrorCode.MEMBER_NOT_FOUND.getErrorCode()));

member.updatePassword(password);
}
Expand All @@ -117,7 +116,7 @@ private boolean isMatchingCode(String code, String savedCode) {

private void validatePassword(LoginRequest request, Member member) {
if (!isPasswordMatching(request.getPassword(), member.getPassword())) {
throw new RestApiException(PASSWORD_INCORRECT.getErrorCode());
throw new RestApiException(MemberErrorCode.PASSWORD_INCORRECT.getErrorCode());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@

@Getter
@RequiredArgsConstructor
public enum MemberErrorCode {//1
public enum MemberErrorCode {

MEMBER_ALREADY_EXIST(new BaseErrorCode(4001, HttpStatus.BAD_REQUEST, "이미 존재하는 회원입니다.")),
MEMBER_NOT_FOUND(new BaseErrorCode(4041, HttpStatus.NOT_FOUND, "존재하지 않는 회원입니다.")),
PASSWORD_INCORRECT(new BaseErrorCode(4011, HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다."))
MEMBER_ALREADY_EXIST(new BaseErrorCode("MEMBER_001", HttpStatus.BAD_REQUEST, "이미 존재하는 회원입니다.")),
MEMBER_NOT_FOUND(new BaseErrorCode("MEMBER_002", HttpStatus.NOT_FOUND, "존재하지 않는 회원입니다.")),
PASSWORD_INCORRECT(new BaseErrorCode("MEMBER_003", HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다."))
;

private final ErrorCode errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.plzdrawing.common.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import org.example.plzdrawing.common.validator.EmailValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface ValidEmail {
String message() default "이메일 형식이 올바르지 않습니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.plzdrawing.common.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import org.example.plzdrawing.common.validator.PasswordValidator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface ValidPassword {
String message() default "비밀번호 형식이 올바르지 않습니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.example.plzdrawing.common.aop.ratelimit;

import static org.example.plzdrawing.common.aop.ratelimit.RateLimitErrorCode.*;

import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
Expand All @@ -11,6 +9,8 @@
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import static org.example.plzdrawing.common.aop.ratelimit.RateLimitErrorCode.EXCEED_REQUEST_COUNT;

@Aspect
@Component
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@

@Getter
@RequiredArgsConstructor
public enum RateLimitErrorCode {//3
public enum RateLimitErrorCode {

EXCEED_REQUEST_COUNT(new BaseErrorCode(4293, HttpStatus.TOO_MANY_REQUESTS, "요청 횟수를 초과하였습니다."))
EXCEED_REQUEST_COUNT(new BaseErrorCode("RATELIMIT_001", HttpStatus.TOO_MANY_REQUESTS, "요청 횟수를 초과하였습니다."))
;

private final ErrorCode errorCode;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@RequiredArgsConstructor
public class BaseErrorCode implements ErrorCode{

private final int code;
private final String code;
private final HttpStatus httpStatus;
private final String message;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,15 @@

@Getter
@RequiredArgsConstructor
public enum CommonErrorCode {
public enum CommonErrorCode{
// 4000 : 요청 실패
INVALID_FIELD(new BaseErrorCode("GLOBAL_001", HttpStatus.BAD_REQUEST, "요청 값이 잘못되었습니다.")),
BAD_REQUEST(new BaseErrorCode("GLOBAL_002", HttpStatus.BAD_REQUEST, "잘못된 파라미터입니다.")),

BAD_REQUEST(new BaseErrorCode(4000, HttpStatus.BAD_REQUEST, "잘못된 파라미터입니다."));
// RequestParam exception
EMPTY_REQUEST_PARAMETER(new BaseErrorCode("GLOBAL_003", HttpStatus.METHOD_NOT_ALLOWED,"Request Parameter가 존재하지 않습니다.")),
METHOD_ARGUMENT_TYPE_MISMATCH(new BaseErrorCode("GLOBAL_004", HttpStatus.METHOD_NOT_ALLOWED, "Request Parameter나 Path Variable의 유형이 불일치합니다."))
;

private final ErrorCode errorCode;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

public interface ErrorCode {

int getCode();
String getCode();
HttpStatus getHttpStatus();
String getMessage();
}
Loading
Loading