diff --git a/src/main/java/com/back/domain/mybar/controller/MyBarController.java b/src/main/java/com/back/domain/mybar/controller/MyBarController.java index 845c7c06..8a6297df 100644 --- a/src/main/java/com/back/domain/mybar/controller/MyBarController.java +++ b/src/main/java/com/back/domain/mybar/controller/MyBarController.java @@ -2,15 +2,18 @@ import com.back.domain.mybar.dto.MyBarListResponseDto; import com.back.domain.mybar.service.MyBarService; +import com.back.global.exception.ServiceException; import com.back.global.rsData.RsData; +import com.back.global.security.SecurityUser; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; @RestController @@ -35,16 +38,18 @@ public class MyBarController { * @return 킵 아이템 목록과 다음 페이지 커서 */ @GetMapping - @Operation(summary = "내 바 목록", description = "내가 킵한 칵테일 목록 조회. 무한스크롤 파라미터 지원") + @Operation(summary = "내 바 목록", description = "내가 킵한 칵테일 목록 조회. 무한 스크롤 커서 지원") public RsData getMyBarList( - @AuthenticationPrincipal(expression = "id") Long userId, + @AuthenticationPrincipal(errorOnInvalidType = false) SecurityUser principal, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime lastKeptAt, @RequestParam(required = false) Long lastId, @RequestParam(defaultValue = "20") @Min(1) @Max(100) int limit ) { + Long userId = principal != null ? principal.getId() : null; + if (userId == null) throw new ServiceException(401, "로그인이 필요합니다."); MyBarListResponseDto body = myBarService.getMyBar(userId, lastKeptAt, lastId, limit); - return RsData.successOf(body); // code=200, message="success" + return RsData.successOf(body); } /** @@ -54,11 +59,13 @@ public RsData getMyBarList( * @return 201 kept */ @PostMapping("/{cocktailId}/keep") - @Operation(summary = "킵 추가/복원", description = "해당 칵테일을 내 바에 킵합니다. 이미 삭제된 경우 복원") + @Operation(summary = "킵 추가/복원", description = "해당 칵테일을 내 바에 킵합니다. 이미 삭제 상태면 복원") public RsData keep( - @AuthenticationPrincipal(expression = "id") Long userId, + @AuthenticationPrincipal(errorOnInvalidType = false) SecurityUser principal, @PathVariable Long cocktailId ) { + Long userId = principal != null ? principal.getId() : null; + if (userId == null) throw new ServiceException(401, "로그인이 필요합니다."); myBarService.keep(userId, cocktailId); return RsData.of(201, "kept"); // Aspect가 HTTP 201로 설정 } @@ -70,12 +77,15 @@ public RsData keep( * @return 200 deleted */ @DeleteMapping("/{cocktailId}/keep") - @Operation(summary = "킵 해제", description = "내 바에서 해당 칵테일 킵을 해제합니다(소프트 삭제, 멱등)") + @Operation(summary = "킵 해제", description = "내 바에서 해당 칵테일을 삭제(소프트 삭제, 멱등)") public RsData unkeep( - @AuthenticationPrincipal(expression = "id") Long userId, + @AuthenticationPrincipal(errorOnInvalidType = false) SecurityUser principal, @PathVariable Long cocktailId ) { + Long userId = principal != null ? principal.getId() : null; + if (userId == null) throw new ServiceException(401, "로그인이 필요합니다."); myBarService.unkeep(userId, cocktailId); return RsData.of(200, "deleted"); } } + diff --git a/src/main/java/com/back/domain/myhistory/service/MyHistoryService.java b/src/main/java/com/back/domain/myhistory/service/MyHistoryService.java index c65dd67e..72d17562 100644 --- a/src/main/java/com/back/domain/myhistory/service/MyHistoryService.java +++ b/src/main/java/com/back/domain/myhistory/service/MyHistoryService.java @@ -6,7 +6,9 @@ import com.back.domain.myhistory.repository.MyHistoryLikedPostRepository; import com.back.domain.post.comment.entity.Comment; import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.entity.PostLike; import com.back.domain.post.post.enums.PostStatus; +import com.back.domain.post.post.enums.PostLikeStatus; import com.back.global.exception.ServiceException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; @@ -127,19 +129,19 @@ public MyHistoryLikedPostListDto getMyLikedPosts(Long userId, LocalDateTime last int safeLimit = Math.max(1, Math.min(limit, 100)); int fetchSize = safeLimit + 1; - List rows; + List rows; if (lastCreatedAt == null || lastId == null) { rows = myHistoryLikedPostRepository.findMyLikedPostsFirstPage( userId, - com.back.domain.post.post.enums.PostLikeStatus.LIKE, - com.back.domain.post.post.enums.PostStatus.DELETED, + PostLikeStatus.LIKE, + PostStatus.DELETED, PageRequest.of(0, fetchSize) ); } else { rows = myHistoryLikedPostRepository.findMyLikedPostsAfter( userId, - com.back.domain.post.post.enums.PostLikeStatus.LIKE, - com.back.domain.post.post.enums.PostStatus.DELETED, + PostLikeStatus.LIKE, + PostStatus.DELETED, lastCreatedAt, lastId, PageRequest.of(0, fetchSize) @@ -150,12 +152,12 @@ public MyHistoryLikedPostListDto getMyLikedPosts(Long userId, LocalDateTime last if (hasNext) rows = rows.subList(0, safeLimit); List items = new ArrayList<>(); - for (com.back.domain.post.post.entity.PostLike postLike : rows) items.add(MyHistoryLikedPostItemDto.from(postLike)); + for (PostLike postLike : rows) items.add(MyHistoryLikedPostItemDto.from(postLike)); LocalDateTime nextCreatedAt = null; Long nextId = null; if (hasNext && !rows.isEmpty()) { - com.back.domain.post.post.entity.PostLike last = rows.get(rows.size() - 1); + PostLike last = rows.get(rows.size() - 1); nextCreatedAt = last.getCreatedAt(); nextId = last.getId(); } @@ -165,10 +167,10 @@ public MyHistoryLikedPostListDto getMyLikedPosts(Long userId, LocalDateTime last @Transactional(readOnly = true) public MyHistoryPostGoResponseDto getPostLinkFromMyLikedPost(Long userId, Long postId) { - com.back.domain.post.post.entity.PostLike postLike = myHistoryLikedPostRepository.findByPostIdAndUserIdLike( + PostLike postLike = myHistoryLikedPostRepository.findByPostIdAndUserIdLike( postId, userId, - com.back.domain.post.post.enums.PostLikeStatus.LIKE + PostLikeStatus.LIKE ); if (postLike == null) { throw new ServiceException(404, "좋아요한 게시글을 찾을 수 없습니다."); @@ -180,4 +182,4 @@ public MyHistoryPostGoResponseDto getPostLinkFromMyLikedPost(Long userId, Long p String apiUrl = "/posts/" + post.getId(); return new MyHistoryPostGoResponseDto(post.getId(), apiUrl); } -} +} \ No newline at end of file