From 1507a0f859cba18a80734fec389bbd2e6cabff05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EA=B2=BD?= Date: Tue, 18 Aug 2026 11:02:19 +0900 Subject: [PATCH] =?UTF-8?q?feat(archive):=20=EC=98=81=EC=83=81=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EB=82=B4=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94=20=EC=97=AC=EB=B6=80(is=5Fliked=5Fby=5Fme)?= =?UTF-8?q?=20=ED=8F=AC=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/archive/api/routers/v1/archive.py | 25 ++++++++++++++++++++++++- app/video/schemas/video_schema.py | 4 ++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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):