Skip to content

Commit

Permalink
[MERGE/#168] 토큰 만료 여부 확인 API 구현
Browse files Browse the repository at this point in the history
[FEAT/#168] 토큰 만료 여부 확인 API 구현
  • Loading branch information
ckkim817 authored Dec 25, 2024
2 parents 280cecf + 98f2d80 commit 308f9b7
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,45 +20,50 @@

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/senior")
@RequestMapping("/api/v1")
public class SeniorController {

private final SeniorService seniorService;

@PatchMapping("/profile")
@PatchMapping("/senior/profile")
public ResponseEntity<Void> patchProfile(
@RequestBody SeniorProfileRequest seniorProfileRequest
) {
seniorService.patchSeniorProfile(seniorProfileRequest);
return ResponseEntity.ok().build();
}

@GetMapping("/time/{seniorId}")
@GetMapping("/senior/time/{seniorId}")
public ResponseEntity<PreferredTimeList> getPreferredTime(
@PathVariable final Long seniorId
) {
return ResponseEntity.ok(seniorService.getSeniorPreferredTime(seniorId));
}

@GetMapping("/search")
@GetMapping("/senior/search")
public ResponseEntity<SeniorFilterResponse> searchFieldPosition(
@RequestParam(required = false) final List<String> field,
@RequestParam(required = false) final List<String> position
) {
return ResponseEntity.ok(seniorService.searchSeniorFieldPosition(field, position));
}

@GetMapping("/{seniorId}")
@GetMapping("/senior/{seniorId}")
public ResponseEntity<SeniorProfileResponse> getSeniorProfile(
@PathVariable final Long seniorId
) {
return ResponseEntity.ok(seniorService.getSeniorProfile(seniorId));
}

@GetMapping("/card/{seniorId}")
@GetMapping("/senior/card/{seniorId}")
public ResponseEntity<SeniorCardProfileResponse> getSeniorCardProfile(
@PathVariable final Long seniorId
) {
return ResponseEntity.ok(seniorService.getSeniorCardProfile(seniorId));
}

@GetMapping("/auth/token/validate")
public ResponseEntity<SeniorNameResponse> validTokenExpired() {
return ResponseEntity.ok(seniorService.validTokenExpired());
}
}
Original file line number Diff line number Diff line change
@@ -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
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 308f9b7

Please sign in to comment.