diff --git a/app/archive/api/routers/v1/archive.py b/app/archive/api/routers/v1/archive.py index cc695d9..e2b0ee6 100644 --- a/app/archive/api/routers/v1/archive.py +++ b/app/archive/api/routers/v1/archive.py @@ -17,7 +17,11 @@ from app.user.models import User from app.utils.logger import get_logger from app.utils.pagination import PaginatedResponse from app.comment.models import Comment -from app.database.like_cache import get_like_counts, mset_like_counts +from app.database.like_cache import ( + bulk_is_user_liked, + get_like_counts, + mset_like_counts, +) from app.video.models import Video, VideoReaction from app.video.schemas.video_schema import VideoListItem @@ -149,6 +153,24 @@ async def get_videos( if vid not in db_found_ids: like_count_map[vid] = 0 + # is_liked_by_me: Redis user-set 기준, 캐시 미스 시 현재 사용자 상태만 DB 조회 + raw_liked = await bulk_is_user_liked(video_ids, current_user.user_uuid) + needs_db_lookup = [ + vid for vid, liked in raw_liked.items() + if liked is None and like_count_map.get(vid, 0) > 0 + ] + if needs_db_lookup: + liked_video_ids = set((await session.execute( + select(VideoReaction.video_id).where( + VideoReaction.video_id.in_(needs_db_lookup), + VideoReaction.user_uuid == current_user.user_uuid, + ) + )).scalars().all()) + for vid in needs_db_lookup: + raw_liked[vid] = vid in liked_video_ids + + liked_map = {vid: bool(liked) for vid, liked in raw_liked.items()} + # VideoListItem으로 변환 items = [ VideoListItem( @@ -161,6 +183,7 @@ async def get_videos( created_at=video.created_at, like_count=like_count_map.get(video.id) or 0, comment_count=comment_count or 0, + is_liked_by_me=liked_map.get(video.id, False), ) for video, project, comment_count in rows ] diff --git a/app/video/schemas/video_schema.py b/app/video/schemas/video_schema.py index f4e3c67..57f21f6 100644 --- a/app/video/schemas/video_schema.py +++ b/app/video/schemas/video_schema.py @@ -162,6 +162,10 @@ class VideoListItem(BaseModel): created_at: Optional[datetime] = Field(None, description="생성 일시") like_count: int = Field(0, description="좋아요 수") comment_count: int = Field(0, description="댓글 수 (대댓글 포함)") + is_liked_by_me: bool = Field( + False, + description="현재 로그인 사용자가 좋아요를 눌렀는지", + ) class VideoThumbnailItem(BaseModel):