diff --git a/src/main/java/EatPic/spring/domain/calendar/controller/CalendarController.java b/src/main/java/EatPic/spring/domain/calendar/controller/CalendarController.java index 290ba46..e86343c 100644 --- a/src/main/java/EatPic/spring/domain/calendar/controller/CalendarController.java +++ b/src/main/java/EatPic/spring/domain/calendar/controller/CalendarController.java @@ -3,9 +3,12 @@ import EatPic.spring.domain.calendar.dto.CalendarDayResponse; import EatPic.spring.domain.calendar.service.CalendarService; import EatPic.spring.domain.card.repository.CardRepository; +import EatPic.spring.domain.user.entity.User; +import EatPic.spring.domain.user.service.UserService; import EatPic.spring.global.common.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -20,6 +23,7 @@ public class CalendarController { private final CalendarService calendarService; + private final UserService userService; @Operation(summary = "캘린더 화면 데이터 조회", //Operation의 구성요소 중 하나로, API에 대한 한줄요약. @@ -27,12 +31,14 @@ public class CalendarController { @GetMapping public ApiResponse> getCalendar( //@AuthenticationPrincipal CustomUserDetails userDetails, + HttpServletRequest request, @RequestParam int year, @RequestParam int month ) { - Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기 + User user = userService.getLoginUser(request); + //Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기 //User user = userDetails.getUser(); //아니면 이렇게 해서 객체 자체를 넘기기 (이게 일반적인 방법) - return ApiResponse.onSuccess(calendarService.getCalendar(userId, year, month)); + return ApiResponse.onSuccess(calendarService.getCalendar(user, year, month)); } diff --git a/src/main/java/EatPic/spring/domain/calendar/service/CalendarService.java b/src/main/java/EatPic/spring/domain/calendar/service/CalendarService.java index 8c3177b..7553620 100644 --- a/src/main/java/EatPic/spring/domain/calendar/service/CalendarService.java +++ b/src/main/java/EatPic/spring/domain/calendar/service/CalendarService.java @@ -4,6 +4,7 @@ import EatPic.spring.domain.card.entity.Card; import EatPic.spring.domain.card.entity.Meal; import EatPic.spring.domain.card.repository.CardRepository; +import EatPic.spring.domain.user.entity.User; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -24,7 +25,9 @@ public class CalendarService { private final CardRepository cardRepository; - public List getCalendar(Long userId, int year, int month) { + public List getCalendar(User user, int year, int month) { + Long userId = user.getId(); + // 현재 월과 이전 월 구하기 YearMonth currentMonth = YearMonth.of(year, month); YearMonth previousMonth = currentMonth.minusMonths(1); diff --git a/src/main/java/EatPic/spring/domain/card/controller/CardController.java b/src/main/java/EatPic/spring/domain/card/controller/CardController.java index b14b7fe..9df0228 100644 --- a/src/main/java/EatPic/spring/domain/card/controller/CardController.java +++ b/src/main/java/EatPic/spring/domain/card/controller/CardController.java @@ -46,6 +46,7 @@ public class CardController { @PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "픽카드 생성하기 (픽카드 기록 작성)", description = "픽카드를 생성할 때 호출되는 api") public ApiResponse createCard( + HttpServletRequest req, @RequestParam("request") String requestJson, @RequestPart(value = "cardImageFile", required = false) MultipartFile cardImageFile) { @@ -57,12 +58,13 @@ public ApiResponse createCard( throw new GeneralException(ErrorStatus.REQUEST_BODY_INVALID); } - Long userId = 1L; + //Long userId = 1L; + User user = userService.getLoginUser(req); if (cardImageFile == null || cardImageFile.isEmpty()) { throw new GeneralException(ErrorStatus.IMAGE_REQUIRED); } - CardResponse.CreateCardResponse response = cardService.createNewCard(request, userId, cardImageFile); + CardResponse.CreateCardResponse response = cardService.createNewCard(request, user, cardImageFile); return ApiResponse.onSuccess(response); } @@ -115,12 +117,13 @@ public ApiResponse> getTodayCards( @Operation(summary = "픽카드 수정", description = "카드의 메모, 레시피, 위치 정보 등을 수정합니다.") @PutMapping("/api/cards/{cardId}") public ResponseEntity> updateCard( + HttpServletRequest req, @Parameter(description = "수정할 카드 ID", example = "12") @PathVariable(name = "cardId") Long cardId, @RequestBody CardUpdateRequest request) { - Long userId = 1L; - return ResponseEntity.ok(ApiResponse.onSuccess(cardService.updateCard(cardId, userId, request))); + User user = userService.getLoginUser(req); + return ResponseEntity.ok(ApiResponse.onSuccess(cardService.updateCard(cardId, user, request))); } @Operation( diff --git a/src/main/java/EatPic/spring/domain/card/service/CardService.java b/src/main/java/EatPic/spring/domain/card/service/CardService.java index cdb8f13..49ebe4c 100644 --- a/src/main/java/EatPic/spring/domain/card/service/CardService.java +++ b/src/main/java/EatPic/spring/domain/card/service/CardService.java @@ -15,12 +15,12 @@ import java.util.List; public interface CardService { - CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, Long userId, MultipartFile cardImageFile); + CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile); CardDetailResponse getCardDetail(Long cardId, Long userId); CardFeedResponse getCardFeed(Long cardId, Long userId); void deleteCard(Long cardId, Long userId); List getTodayCards(Long userId); - CardDetailResponse updateCard(Long cardId, Long userId, CardUpdateRequest request); + CardDetailResponse updateCard(Long cardId, User user, CardUpdateRequest request); CardResponse.PagedCardFeedResponseDto getCardFeedByCursor(HttpServletRequest request, Long userId, int size, Long cursor); List getRecommendedCardPreviews(Long userId); } diff --git a/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java b/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java index 3f89eb7..ae59a60 100644 --- a/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java +++ b/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java @@ -98,10 +98,11 @@ private void connectHashtagsToCard(Card card, List hashtags, User user) @Override @Transactional - public CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, Long userId, MultipartFile cardImageFile) { + public CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile) { + Long userId = user.getId(); // 아직 유저 관련 처리 안했음 - User user = userRepository.findUserById(userId); + //User user = userRepository.findUserById(userId); // 오늘 날짜 00:00부터 23:59:59까지 범위 계산 LocalDate today = LocalDate.now(); @@ -287,11 +288,11 @@ public List getTodayCards(Long userId) { @Override @Transactional - public CardDetailResponse updateCard(Long cardId, Long userId, CardUpdateRequest request) { + public CardDetailResponse updateCard(Long cardId, User user, CardUpdateRequest request) { Card card = cardRepository.findById(cardId) .orElseThrow(() -> new ExceptionHandler(ErrorStatus.CARD_NOT_FOUND)); - if (!card.getUser().getId().equals(userId)) { + if (!card.getUser().getId().equals(user.getId())) { throw new ExceptionHandler(ErrorStatus.CARD_UPDATE_FORBIDDEN); } diff --git a/src/main/java/EatPic/spring/domain/notification/controller/NotificationController.java b/src/main/java/EatPic/spring/domain/notification/controller/NotificationController.java index 7bb5fd4..2e1a5d8 100644 --- a/src/main/java/EatPic/spring/domain/notification/controller/NotificationController.java +++ b/src/main/java/EatPic/spring/domain/notification/controller/NotificationController.java @@ -7,6 +7,7 @@ import EatPic.spring.global.common.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; @@ -25,25 +26,34 @@ public class NotificationController { @GetMapping("/recent") @Operation(summary = "최근 알림 목록 조회 (7일 이내)", description = "현재 로그인한 사용자의 최근 알림을 조회합니다.") - public ApiResponse> getRecentNotifications() { - Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기 + public ApiResponse> getRecentNotifications( + HttpServletRequest request + ) { + User user = userService.getLoginUser(request); + //Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기 //User user = userDetails.getUser(); //아니면 이렇게 해서 객체 자체를 넘기기 (이게 일반적인 방법) - return ApiResponse.onSuccess(notificationService.getRecentNotifications(userId)); + return ApiResponse.onSuccess(notificationService.getRecentNotifications(user)); } @PostMapping("/check") @Operation(summary = "알림 확인 시간 업데이트", description = "사용자가 알림 화면에 들어가면 마지막 확인 시간을 업데이트합니다.") - public ApiResponse checkNotifications() { - Long userId = 1L; // 로그인 기능 구현 전 임시 사용자 - notificationService.checkNotifications(userId); + public ApiResponse checkNotifications( + HttpServletRequest request + ) { + User user = userService.getLoginUser(request); + //Long userId = 1L; // 로그인 기능 구현 전 임시 사용자 + notificationService.checkNotifications(user); return ApiResponse.onSuccess(null); } @GetMapping("/unread-status") @Operation(summary = "새 알림 여부 확인", description = "최근 알림 생성 시각과 마지막 확인 시각을 비교하여 새 알림 여부를 반환합니다.") - public ApiResponse> getUnreadStatus() { - Long userId = 1L; // 로그인 기능 구현 전 임시 사용자 - boolean isUnread = notificationService.isUnreadNotification(userId); + public ApiResponse> getUnreadStatus( + HttpServletRequest request + ) { + User user = userService.getLoginUser(request); + //Long userId = 1L; // 로그인 기능 구현 전 임시 사용자 + boolean isUnread = notificationService.isUnreadNotification(user); return ApiResponse.onSuccess(Map.of("isUnread", isUnread)); } diff --git a/src/main/java/EatPic/spring/domain/notification/service/NotificationService.java b/src/main/java/EatPic/spring/domain/notification/service/NotificationService.java index 3c68af0..3329fa4 100644 --- a/src/main/java/EatPic/spring/domain/notification/service/NotificationService.java +++ b/src/main/java/EatPic/spring/domain/notification/service/NotificationService.java @@ -11,6 +11,7 @@ import EatPic.spring.domain.user.repository.UserFollowRepository; import EatPic.spring.domain.user.repository.UserRepository; import EatPic.spring.global.common.code.status.ErrorStatus; +import EatPic.spring.global.common.exception.GeneralException; import EatPic.spring.global.common.exception.handler.ExceptionHandler; import java.time.LocalDateTime; import java.util.List; @@ -27,8 +28,7 @@ public class NotificationService { private final UserRepository userRepository; - public List getRecentNotifications(Long userId) { - User currentUser = userRepository.findById(userId).orElse(null); + public List getRecentNotifications(User currentUser) { // 7일 전 기준 시각 LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7); @@ -62,18 +62,12 @@ private RecentNotificationResponse convertToDto(Notification notification, User return NotificationConverter.toRecentNotificationResponse(notification, cardImageUrl, isFollowing); } - public void checkNotifications(Long userId) { - User user = userRepository.findById(userId) - .orElseThrow(() -> new ExceptionHandler(ErrorStatus.USER_NOT_FOUND)); - + public void checkNotifications(User user) { user.updateLastNotificationCheckAt(LocalDateTime.now()); userRepository.save(user); } - public boolean isUnreadNotification(Long userId) { - User user = userRepository.findById(userId) - .orElseThrow(() -> new ExceptionHandler(ErrorStatus.USER_NOT_FOUND)); - + public boolean isUnreadNotification(User user) { LocalDateTime lastChecked = user.getLastNotificationCheckAt(); Notification latest = notificationRepository.findTopByReceiverOrderByCreatedAtDesc(user); diff --git a/src/main/java/EatPic/spring/domain/user/controller/UserBadgeController.java b/src/main/java/EatPic/spring/domain/user/controller/UserBadgeController.java index a95aa5c..4369aab 100644 --- a/src/main/java/EatPic/spring/domain/user/controller/UserBadgeController.java +++ b/src/main/java/EatPic/spring/domain/user/controller/UserBadgeController.java @@ -5,9 +5,11 @@ import EatPic.spring.domain.user.entity.User; import EatPic.spring.domain.user.repository.UserBadgeRepository; import EatPic.spring.domain.user.service.UserBadgeService; +import EatPic.spring.domain.user.service.UserService; import EatPic.spring.global.common.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -23,21 +25,27 @@ public class UserBadgeController { private final UserBadgeRepository userBadgeRepository; private final UserBadgeService userBadgeService; + private final UserService userService; @GetMapping("/home") @Operation(summary = "홈화면 진입 시 유저 뱃지 리스트 이행률순 조회 ", description = "홈화면에서 유저가 보유한 뱃지 리스트를 이행률 기준으로 정렬하여 조회합니다.") - public ApiResponse> getUserBadgesForHome() { - Long userId = 1L; - List responses = userBadgeService.getUserBadgesForHome(userId); + public ApiResponse> getUserBadgesForHome( + HttpServletRequest request + ) { + User user = userService.getLoginUser(request); + //Long userId = 1L; + List responses = userBadgeService.getUserBadgesForHome(user); return ApiResponse.onSuccess(responses); } @Operation(summary = "유저 뱃지 상세 조회", description = "뱃지 팝업에 들어갈 상세 정보를 조회합니다.") @GetMapping("/my/{userBadgeId}") public ApiResponse getBadgeDetail( + HttpServletRequest request, @PathVariable Long userBadgeId) { - Long userId = 1L; - return ApiResponse.onSuccess(userBadgeService.getBadgeDetail(userId, userBadgeId)); + User user = userService.getLoginUser(request); + //Long userId = 1L; + return ApiResponse.onSuccess(userBadgeService.getBadgeDetail(user, userBadgeId)); } } diff --git a/src/main/java/EatPic/spring/domain/user/service/UserBadgeService.java b/src/main/java/EatPic/spring/domain/user/service/UserBadgeService.java index 378aaa7..8508209 100644 --- a/src/main/java/EatPic/spring/domain/user/service/UserBadgeService.java +++ b/src/main/java/EatPic/spring/domain/user/service/UserBadgeService.java @@ -34,14 +34,14 @@ public class UserBadgeService { private final ReactionRepository reactionRepository; // 홈화면 뱃지 리스트 조회 - public List getUserBadgesForHome(Long userId) { - User user = userRepository.findUserById(userId); // 로그인 적용할 때 바꾸기!! 인자 User로 받기! + @Transactional + public List getUserBadgesForHome(User user) { List userBadges = userBadgeRepository.findByUser(user); return UserBadgeConverter.toHomeBadgeDTOList(userBadges); } - public BadgeDetailResponseDTO getBadgeDetail(Long userId, Long userBadgeId) { - User user = userRepository.findUserById(userId); + @Transactional + public BadgeDetailResponseDTO getBadgeDetail(User user, Long userBadgeId) { UserBadge userBadge = userBadgeRepository.findByUser_IdAndUserBadgeId(user.getId(), userBadgeId) .orElseThrow(() -> new ExceptionHandler(ErrorStatus._BAD_REQUEST)); return UserBadgeConverter.toBadgeDetailResponse(userBadge);