Skip to content

Commit

Permalink
Merge pull request #34 from PetQ-A/ci/resetting
Browse files Browse the repository at this point in the history
Ci/resetting
  • Loading branch information
dong99u authored Oct 6, 2024
2 parents 6430d89 + 81eb3a5 commit 485cc9c
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 72 deletions.
9 changes: 5 additions & 4 deletions src/main/java/com/petqa/api/AuthAPIController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
Expand All @@ -20,7 +22,6 @@
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
Expand Down Expand Up @@ -113,9 +114,9 @@ public ResponseEntity<ApiResponse<String>> logout(HttpServletRequest request, Ht
return ResponseEntity.ok(ApiResponse.onSuccess("로그아웃 성공"));
}

@PostMapping("/duplicate")
public ApiResponse<String> checkDuplicate(@RequestBody @Valid UserRequestDTO.DuplicateCheckDTO duplicateCheckDTO) {
return ApiResponse.onSuccess(userCommandService.duplicateCheck(duplicateCheckDTO));
@GetMapping("/duplicate")
public ApiResponse<String> checkDuplicate(@RequestParam String username) {
return ApiResponse.onSuccess(userCommandService.duplicateCheck(username));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,76 @@
package com.petqa.apiPayload.apiPayload.code.status;

import org.springframework.http.HttpStatus;

import com.petqa.apiPayload.apiPayload.code.BaseErrorCode;
import com.petqa.apiPayload.apiPayload.code.ErrorReasonDTO;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
@AllArgsConstructor
public enum ErrorStatus implements BaseErrorCode {
// 가장 일반적인 응답
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON500", "서버 에러, 관리자에게 문의 바랍니다."),
BAD_REQUEST(HttpStatus.BAD_REQUEST, "COMMON400", "잘못된 요청입니다."),
UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "COMMON401", "인증이 필요합니다."),
FORBIDDEN(HttpStatus.FORBIDDEN, "COMMON403", "금지된 요청입니다."),
// 가장 일반적인 응답
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON500", "서버 에러, 관리자에게 문의 바랍니다."),
BAD_REQUEST(HttpStatus.BAD_REQUEST, "COMMON400", "잘못된 요청입니다."),
UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "COMMON401", "인증이 필요합니다."),
FORBIDDEN(HttpStatus.FORBIDDEN, "COMMON403", "금지된 요청입니다."),

// 유저 관련 에러
USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER4001", "유저를 찾을 수 없습니다."),
USER_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "USER4002",
"이미 존재하는 유저입니다."),
USER_NOT_MATCH(HttpStatus.BAD_REQUEST, "USER4003", "유저 정보가 일치하지 않습니다."),
USER_NOT_AUTHORIZED(HttpStatus.BAD_REQUEST, "USER4004", "유저 권한이 없습니다."),
USER_NOT_VALID(HttpStatus.BAD_REQUEST, "USER4005", "유저 정보가 유효하지 않습니다."),
USER_NOT_ACTIVE(HttpStatus.BAD_REQUEST, "USER4006", "유저가 비활성화 되었습니다."),
USER_NOT_LOGIN(HttpStatus.BAD_REQUEST, "USER4007", "로그인이 필요합니다."),
USER_NOT_EMAIL(HttpStatus.BAD_REQUEST, "USER4008", "이메일이 없습니다."),
USER_NOT_PASSWORD(HttpStatus.BAD_REQUEST, "USER4009",
"비밀번호가 없습니다."),
USER_NOT_NAME(HttpStatus.BAD_REQUEST, "USER4010", "이름이 없습니다."),
USER_NOT_PHONE(HttpStatus.BAD_REQUEST, "USER4011", "전화번호가 없습니다."),
// 유저 관련 에러
USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER4001", "유저를 찾을 수 없습니다."),
USER_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "USER4002",
"이미 존재하는 유저입니다."),
USER_NOT_MATCH(HttpStatus.BAD_REQUEST, "USER4003", "유저 정보가 일치하지 않습니다."),
USER_NOT_AUTHORIZED(HttpStatus.BAD_REQUEST, "USER4004", "유저 권한이 없습니다."),
USER_NOT_VALID(HttpStatus.BAD_REQUEST, "USER4005", "유저 정보가 유효하지 않습니다."),
USER_NOT_ACTIVE(HttpStatus.BAD_REQUEST, "USER4006", "유저가 비활성화 되었습니다."),
USER_NOT_LOGIN(HttpStatus.BAD_REQUEST, "USER4007", "로그인이 필요합니다."),
USER_NOT_EMAIL(HttpStatus.BAD_REQUEST, "USER4008", "이메일이 없습니다."),
USER_NOT_PASSWORD(HttpStatus.BAD_REQUEST, "USER4009",
"비밀번호가 없습니다."),
USER_NOT_NAME(HttpStatus.BAD_REQUEST, "USER4010", "이름이 없습니다."),
USER_NOT_PHONE(HttpStatus.BAD_REQUEST, "USER4011", "전화번호가 없습니다."),
USERNAME_IS_NULL(HttpStatus.BAD_REQUEST, "USER4012", "유저 이름이 없습니다."),

// Token 관련 에러
REFRESH_TOKEN_NOT_FOUND(HttpStatus.BAD_REQUEST, "REFRESH4001", "리프레시 토큰이 없습니다."),
REFRESH_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "REFRESH4002", "리프레시 토큰이 만료되었습니다."),
ACCESS_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "ACCESS4001", "액세스 토큰이 만료되었습니다."),
INVALID_TOKEN(HttpStatus.BAD_REQUEST, "TOKEN4001", "유효하지 않은 토큰입니다."),
// Token 관련 에러
REFRESH_TOKEN_NOT_FOUND(HttpStatus.BAD_REQUEST, "REFRESH4001", "리프레시 토큰이 없습니다."),
REFRESH_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "REFRESH4002", "리프레시 토큰이 만료되었습니다."),
ACCESS_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "ACCESS4001", "액세스 토큰이 만료되었습니다."),
INVALID_TOKEN(HttpStatus.BAD_REQUEST, "TOKEN4001", "유효하지 않은 토큰입니다."),

FILE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "FILE4001", "파일 업로드에 실패했습니다."),
FILE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "FILE4001", "파일 업로드에 실패했습니다."),

// 커뮤니티 관련 에러
POST_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3001", "존재하지 않는 게시글 입니다."),
COMMENT_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3001", "존재하지 않는 댓글 입니다."),
VOTE_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3002", "존재하지 않는 투표입니다."),
VOTE_NOT_MULTI(HttpStatus.BAD_REQUEST, "COMMUNITY3003", "복수 선택이 불가능한 투표입니다."),
VOTE_AFTER_END(HttpStatus.BAD_REQUEST, "COMMUNITY3004", "투표기간이 끝났습니다."),
VOTE_COUNT_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3005", "이미 투표했습니다."),
VOTE_ITEM_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3006", "존재하지 않는 투표 선택지입니다.")
;
// 커뮤니티 관련 에러
POST_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3001", "존재하지 않는 게시글 입니다."),
COMMENT_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3001", "존재하지 않는 댓글 입니다."),
VOTE_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3002", "존재하지 않는 투표입니다."),
VOTE_NOT_MULTI(HttpStatus.BAD_REQUEST, "COMMUNITY3003", "복수 선택이 불가능한 투표입니다."),
VOTE_AFTER_END(HttpStatus.BAD_REQUEST, "COMMUNITY3004", "투표기간이 끝났습니다."),
VOTE_COUNT_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3005", "이미 투표했습니다."),
VOTE_ITEM_NOT_EXIST(HttpStatus.BAD_REQUEST, "COMMUNITY3006", "존재하지 않는 투표 선택지입니다."),
;

private final HttpStatus httpStatus;
private final String code;
private final String message;
private final HttpStatus httpStatus;
private final String code;
private final String message;

@Override
public ErrorReasonDTO getReason() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.isSuccess(false)
.build();
}
@Override
public ErrorReasonDTO getReason() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.isSuccess(false)
.build();
}

@Override
public ErrorReasonDTO getReasonHttpStatus() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.isSuccess(false)
.httpStatus(httpStatus)
.build();
}
@Override
public ErrorReasonDTO getReasonHttpStatus() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.isSuccess(false)
.httpStatus(httpStatus)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ public interface UserCommandService {

void logout(String refreshToken);

String duplicateCheck(UserRequestDTO.DuplicateCheckDTO duplicateCheckDTO);
String duplicateCheck(String username);
}
39 changes: 27 additions & 12 deletions src/main/java/com/petqa/service/user/UserCommandServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import com.petqa.service.refresh.RefreshCommandService;
import com.petqa.service.s3Bucket.S3Service;

import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import lombok.RequiredArgsConstructor;

@Service
Expand Down Expand Up @@ -161,28 +163,38 @@ public AuthResponseDTO.ReissueResponseDTO reissue(String refreshToken) {
if (refreshToken == null) {
throw new TokenHandler(ErrorStatus.INVALID_TOKEN);
}

try {
jwtUtil.isExpired(refreshToken);
} catch (Exception e) {
// Check if the token is expired
if (jwtUtil.isExpired(refreshToken)) {
throw new TokenHandler(ErrorStatus.REFRESH_TOKEN_EXPIRED);
}
} catch (ExpiredJwtException e) {
// Token has expired
throw new TokenHandler(ErrorStatus.REFRESH_TOKEN_EXPIRED);
} catch (JwtException e) {
// Token is invalid for other reasons
throw new TokenHandler(ErrorStatus.INVALID_TOKEN);
} catch (Exception e) {
// Handle any other exceptions
throw new TokenHandler(ErrorStatus.INVALID_TOKEN);
}

// Extract claims safely
String category = jwtUtil.getCategory(refreshToken);

if (!category.equals("refresh")) {
if (!"refresh".equals(category)) {
throw new TokenHandler(ErrorStatus.INVALID_TOKEN);
}

String socialId = jwtUtil.getSocialId(refreshToken);
String username = jwtUtil.getUsername(refreshToken);

// 기존 리프레시 토큰 삭제
refreshRepository.deleteByRefresh(refreshToken);
refreshCommandService.addRefresh(username, socialId, refreshToken, refreshTokenExpiration);

String newAccessToken = jwtUtil.createJwt("access", socialId, username, accessTokenExpiration);
// 새로운 리프레시 토큰 생성
String newRefreshToken = jwtUtil.createJwt("refresh", socialId, username, refreshTokenExpiration);

// 새로운 리프레시 토큰 저장
refreshCommandService.addRefresh(username, socialId, newRefreshToken, refreshTokenExpiration);
// 새로운 액세스 토큰 생성
String newAccessToken = jwtUtil.createJwt("access", socialId, username, accessTokenExpiration);
return AuthResponseDTO.ReissueResponseDTO.builder()
.accessToken(newAccessToken)
.refreshToken(newRefreshToken)
Expand Down Expand Up @@ -214,8 +226,11 @@ public void logout(String refreshToken) {
}

@Override
public String duplicateCheck(UserRequestDTO.DuplicateCheckDTO duplicateCheckDTO) {
String username = duplicateCheckDTO.getUsername();
public String duplicateCheck(String username) {
if (username == null || username.isEmpty()) {
throw new UserHandler(ErrorStatus.USERNAME_IS_NULL);
}

userRepository.findUserByUsername(username)
.ifPresent(u -> {
throw new UserHandler(ErrorStatus.USER_ALREADY_EXIST);
Expand Down

0 comments on commit 485cc9c

Please sign in to comment.