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
Expand Up @@ -4,9 +4,11 @@
import com.example.triptalk.domain.tripPlan.enums.TripStatus;
import com.example.triptalk.domain.tripPlan.service.TripPlanService;
import com.example.triptalk.global.apiPayload.ApiResponse;
import com.example.triptalk.global.security.AuthUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand All @@ -17,15 +19,17 @@
public class TripPlanController {

private final TripPlanService tripPlanService;
private final AuthUtil authUtil;

@GetMapping("/{tripPlanId}")
@Operation(summary = "여행 일정 조회", description = "tripPlanId로 여행 일정을 조회합니다.")
public ApiResponse<TripPlanResponse.TripPlanDTO> getTripPlan(
@Parameter(description = "tripPlan ID", example = "1", required = true)
@PathVariable Long tripPlanId
@PathVariable Long tripPlanId,
HttpServletRequest request
) {
// 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기
TripPlanResponse.TripPlanDTO response = tripPlanService.getTripPlan(tripPlanId, 1L);
Long userId = authUtil.getUserIdFromRequest(request);
TripPlanResponse.TripPlanDTO response = tripPlanService.getTripPlan(tripPlanId, userId);
return ApiResponse.onSuccess(response);
}

Expand All @@ -35,21 +39,23 @@ public ApiResponse<TripPlanResponse.TripPlanListResultDTO> getMyTripPlans(
@Parameter(description = "여행 상태 필터", example = "PLANNED", required = true)
@RequestParam TripStatus status,
@Parameter(description = "다음 커서 ID (처음 요청 시 null)", example = "null")
@RequestParam(required = false) Long cursorId
@RequestParam(required = false) Long cursorId,
HttpServletRequest request
) {
// 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기
TripPlanResponse.TripPlanListResultDTO response = tripPlanService.getMyTripPlans(1L, status, cursorId);
Long userId = authUtil.getUserIdFromRequest(request);
TripPlanResponse.TripPlanListResultDTO response = tripPlanService.getMyTripPlans(userId, status, cursorId);
return ApiResponse.onSuccess(response);
}

@PatchMapping("/{tripPlanId}/traveled")
@Operation(summary = "여행 상태 완료 처리", description = "여행 계획의 상태를 PLANNED에서 TRAVELED로 변경합니다.")
public ApiResponse<TripPlanResponse.TripPlanStatusDTO> markTripPlanAsTraveled(
@Parameter(description = "tripPlan ID", example = "1", required = true)
@PathVariable Long tripPlanId
@PathVariable Long tripPlanId,
HttpServletRequest request
) {
// 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기
TripPlanResponse.TripPlanStatusDTO response = tripPlanService.changeTripPlanStatusToTraveled(tripPlanId, 1L);
Long userId = authUtil.getUserIdFromRequest(request);
TripPlanResponse.TripPlanStatusDTO response = tripPlanService.changeTripPlanStatusToTraveled(tripPlanId, userId);
return ApiResponse.onSuccess(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
import com.example.triptalk.domain.user.dto.UserResponse;
import com.example.triptalk.domain.user.service.UserService;
import com.example.triptalk.global.apiPayload.ApiResponse;
import com.example.triptalk.global.security.AuthUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand All @@ -16,15 +17,13 @@
public class UserController {

private final UserService userService;
private final AuthUtil authUtil;

@GetMapping("/{userId}")
@GetMapping("/me")
@Operation(summary = "마이페이지 유저 정보 조회 API", description = "현재 로그인한 사용자의 마이페이지 정보를 조회하는 API입니다.")
public ApiResponse<UserResponse.UserInfoDTO> getUserInfo(
@Parameter(description = "유저 ID", required = true, example = "1")
@PathVariable Long userId
) {
// 임시 유저로 설정
UserResponse.UserInfoDTO response = userService.getUserInfo(1L);
public ApiResponse<UserResponse.UserInfoDTO> getUserInfo(HttpServletRequest request) {
Long userId = authUtil.getUserIdFromRequest(request);
UserResponse.UserInfoDTO response = userService.getUserInfo(userId);
return ApiResponse.onSuccess(response);
}
}
Expand Down
51 changes: 51 additions & 0 deletions src/main/java/com/example/triptalk/global/security/AuthUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.example.triptalk.global.security;

import com.example.triptalk.domain.user.entity.User;
import com.example.triptalk.domain.user.repository.UserRepository;
import com.example.triptalk.global.apiPayload.code.status.ErrorStatus;
import com.example.triptalk.global.apiPayload.exception.handler.ErrorHandler;
import com.example.triptalk.global.security.jwt.JwtTokenProvider;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

@Component
@RequiredArgsConstructor
public class AuthUtil {

private final JwtTokenProvider jwtTokenProvider;
private final UserRepository userRepository;

/**
* HTTP 요청에서 JWT 토큰을 추출하여 사용자 ID를 반환
* @param request HTTP 요청
* @return 사용자 ID
*/
public Long getUserIdFromRequest(HttpServletRequest request) {
String token = resolveToken(request);
if (token == null || !jwtTokenProvider.validateToken(token)) {
throw new ErrorHandler(ErrorStatus._UNAUTHORIZED);
}

String email = jwtTokenProvider.getEmailFromToken(token);
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new ErrorHandler(ErrorStatus.USER_NOT_FOUND));

return user.getId();
}

/**
* HTTP 요청 헤더에서 JWT 토큰 추출
* @param request HTTP 요청
* @return JWT 토큰 (없으면 null)
*/
private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
}

Loading