From 98f2d80ea9616902653458759009f37faccb6673 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Thu, 26 Dec 2024 02:49:20 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT/#168]=20=ED=86=A0=ED=81=B0=20=EB=A7=8C?= =?UTF-8?q?=EB=A3=8C=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../senior/controller/SeniorController.java | 18 ++++++++++++------ .../domain/senior/dto/SeniorNameResponse.java | 14 ++++++++++++++ .../domain/senior/service/SeniorService.java | 9 +++++++++ .../auth/filter/JwtAuthenticationFilter.java | 5 +++++ .../global/exception/enums/ErrorType.java | 2 +- 5 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/sopt/seonyakServer/domain/senior/dto/SeniorNameResponse.java diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/controller/SeniorController.java b/src/main/java/org/sopt/seonyakServer/domain/senior/controller/SeniorController.java index 3431b45..e91bcc7 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/senior/controller/SeniorController.java +++ b/src/main/java/org/sopt/seonyakServer/domain/senior/controller/SeniorController.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import org.sopt.seonyakServer.domain.senior.dto.SeniorCardProfileResponse; import org.sopt.seonyakServer.domain.senior.dto.SeniorFilterResponse; +import org.sopt.seonyakServer.domain.senior.dto.SeniorNameResponse; import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileRequest; import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileResponse; import org.sopt.seonyakServer.domain.senior.model.PreferredTimeList; @@ -19,12 +20,12 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1/senior") +@RequestMapping("/api/v1") public class SeniorController { private final SeniorService seniorService; - @PatchMapping("/profile") + @PatchMapping("/senior/profile") public ResponseEntity patchProfile( @RequestBody SeniorProfileRequest seniorProfileRequest ) { @@ -32,14 +33,14 @@ public ResponseEntity patchProfile( return ResponseEntity.ok().build(); } - @GetMapping("/time/{seniorId}") + @GetMapping("/senior/time/{seniorId}") public ResponseEntity getPreferredTime( @PathVariable final Long seniorId ) { return ResponseEntity.ok(seniorService.getSeniorPreferredTime(seniorId)); } - @GetMapping("/search") + @GetMapping("/senior/search") public ResponseEntity searchFieldPosition( @RequestParam(required = false) final List field, @RequestParam(required = false) final List position @@ -47,17 +48,22 @@ public ResponseEntity searchFieldPosition( return ResponseEntity.ok(seniorService.searchSeniorFieldPosition(field, position)); } - @GetMapping("/{seniorId}") + @GetMapping("/senior/{seniorId}") public ResponseEntity getSeniorProfile( @PathVariable final Long seniorId ) { return ResponseEntity.ok(seniorService.getSeniorProfile(seniorId)); } - @GetMapping("/card/{seniorId}") + @GetMapping("/senior/card/{seniorId}") public ResponseEntity getSeniorCardProfile( @PathVariable final Long seniorId ) { return ResponseEntity.ok(seniorService.getSeniorCardProfile(seniorId)); } + + @GetMapping("/auth/token/validate") + public ResponseEntity validTokenExpired() { + return ResponseEntity.ok(seniorService.validTokenExpired()); + } } diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/dto/SeniorNameResponse.java b/src/main/java/org/sopt/seonyakServer/domain/senior/dto/SeniorNameResponse.java new file mode 100644 index 0000000..f1949f3 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/senior/dto/SeniorNameResponse.java @@ -0,0 +1,14 @@ +package org.sopt.seonyakServer.domain.senior.dto; + +public record SeniorNameResponse( + String name +) { + + public static SeniorNameResponse of( + final String name + ) { + return new SeniorNameResponse( + name + ); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java b/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java index 0a62b0d..9fd5cae 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java +++ b/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java @@ -8,6 +8,7 @@ import org.sopt.seonyakServer.domain.member.repository.MemberRepository; import org.sopt.seonyakServer.domain.senior.dto.SeniorCardProfileResponse; import org.sopt.seonyakServer.domain.senior.dto.SeniorFilterResponse; +import org.sopt.seonyakServer.domain.senior.dto.SeniorNameResponse; import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileRequest; import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileResponse; import org.sopt.seonyakServer.domain.senior.model.PreferredTimeList; @@ -109,4 +110,12 @@ public SeniorCardProfileResponse getSeniorCardProfile(final Long seniorId) { senior.getMember().getImage() ); } + + @Transactional(readOnly = true) + public SeniorNameResponse validTokenExpired() { + Senior senior = seniorRepository.findSeniorByMemberId(principalHandler.getUserIdFromPrincipal()) + .orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_SENIOR_BY_MEMBER)); + + return SeniorNameResponse.of(senior.getMember().getNickname()); + } } diff --git a/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java b/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java index 28a0033..bdfb7d6 100644 --- a/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java +++ b/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java @@ -2,6 +2,7 @@ import static org.sopt.seonyakServer.global.auth.jwt.JwtValidationType.VALID_JWT; +import io.jsonwebtoken.ExpiredJwtException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -49,6 +50,10 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, // 따라서 예외를 직접 throw로 던져주는 것이 아닌, 발생시키기만 하고 다음 필터 호출로 이어지게끔 해야 하고, (doFilter) // 이렇게 하면 API의 permitAll 적용 여부에 따라 ExceptionTranslationFilter를 거칠지 판단하게 된다. log.error("JwtAuthentication Authentication Exception Occurs! - {}", exception.getMessage()); + + if (exception instanceof ExpiredJwtException) { + throw new CustomException(ErrorType.EXPIRED_JWT_TOKEN); + } } // 다음 필터로 요청 전달 (호출) filterChain.doFilter(request, response); diff --git a/src/main/java/org/sopt/seonyakServer/global/exception/enums/ErrorType.java b/src/main/java/org/sopt/seonyakServer/global/exception/enums/ErrorType.java index de246e2..004381e 100644 --- a/src/main/java/org/sopt/seonyakServer/global/exception/enums/ErrorType.java +++ b/src/main/java/org/sopt/seonyakServer/global/exception/enums/ErrorType.java @@ -77,7 +77,7 @@ public enum ErrorType { NOT_FOUND_APPOINTMENT_ERROR(HttpStatus.NOT_FOUND, "40406", "존재하지 않는 약속입니다."), NOT_FOUND_GOOGLE_MEET_LINK_ERROR(HttpStatus.NOT_FOUND, "40407", "구글 미트 링크가 존재하지 않는 약속입니다."), NOT_FOUND_UNIV_EMAIL_DOMAIN_ERROR(HttpStatus.NOT_FOUND, "40408", "해당 대학교에 해당하는 메일 도메인이 없습니다."), - NOT_FOUND_UNIV_NAME_ERROR(HttpStatus.NOT_FOUND, "40409", "디비에 존재하지 않는 대학명입니다."), + NOT_FOUND_UNIV_NAME_ERROR(HttpStatus.NOT_FOUND, "40409", "DB에 존재하지 않는 대학명입니다."), /** * 409 CONFLICT