Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ci/resetting #34

Merged
merged 2 commits into from
Oct 6, 2024
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
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
Loading