From f884167db8263855afa23af52a39abdbe97d4b24 Mon Sep 17 00:00:00 2001 From: Leon <147289645+LeoninCS@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:45:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96islLked=E7=9A=84?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F=E5=B9=B6=E5=B0=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9B=B8=E5=90=8C=E4=BB=A3=E7=A0=81=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E4=B8=BA=E4=B8=80=E4=B8=AA=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/feed/repo.go | 12 ++--- internal/feed/service.go | 91 ++++++++++++------------------------- internal/video/like_repo.go | 20 ++++++++ 3 files changed, 56 insertions(+), 67 deletions(-) diff --git a/internal/feed/repo.go b/internal/feed/repo.go index 3ec7123..1f116d7 100644 --- a/internal/feed/repo.go +++ b/internal/feed/repo.go @@ -17,8 +17,8 @@ func NewFeedRepository(db *gorm.DB) *FeedRepository { return &FeedRepository{db: db} } -func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBefore time.Time) ([]video.Video, error) { - var videos []video.Video +func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBefore time.Time) ([]*video.Video, error) { + var videos []*video.Video query := repo.db.WithContext(ctx).Model(&video.Video{}). Order("create_time DESC") if !latestBefore.IsZero() { @@ -30,8 +30,8 @@ func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBef return videos, nil } -func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit int, cursor *LikesCountCursor) ([]video.Video, error) { - var videos []video.Video +func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit int, cursor *LikesCountCursor) ([]*video.Video, error) { + var videos []*video.Video query := repo.db.WithContext(ctx).Model(&video.Video{}). Order("likes_count DESC, id DESC") @@ -49,8 +49,8 @@ func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit return videos, nil } -func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) ([]video.Video, error) { - var videos []video.Video +func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) ([]*video.Video, error) { + var videos []*video.Video query := repo.db.WithContext(ctx).Model(&video.Video{}). Order("create_time DESC") if viewerAccountID > 0 { diff --git a/internal/feed/service.go b/internal/feed/service.go index f2d0eb5..948406a 100644 --- a/internal/feed/service.go +++ b/internal/feed/service.go @@ -3,9 +3,9 @@ package feed import ( "context" "encoding/json" + rediscache "feedsystem_video_go/internal/redis" "feedsystem_video_go/internal/video" "fmt" - rediscache "feedsystem_video_go/internal/redis" "time" ) @@ -52,28 +52,9 @@ func (f *FeedService) ListLatest(ctx context.Context, limit int, latestBefore ti nextTime = 0 } hasMore := len(videos) == limit - feedVideos := make([]FeedVideoItem, 0, len(videos)) - for _, video := range videos { - var isLiked bool - if viewerAccountID == 0 { - isLiked = false - } else { - isLiked, err = f.likeRepo.IsLiked(ctx, video.ID, viewerAccountID) - if err != nil { - return ListLatestResponse{}, err - } - } - feedVideos = append(feedVideos, FeedVideoItem{ - ID: video.ID, - Author: FeedAuthor{ID: video.AuthorID, Username: video.Username}, - Title: video.Title, - Description: video.Description, - PlayURL: video.PlayURL, - CoverURL: video.CoverURL, - CreateTime: video.CreateTime.Unix(), - LikesCount: video.LikesCount, - IsLiked: isLiked, - }) + feedVideos, err := f.buildFeedVideos(ctx, videos, viewerAccountID) + if err != nil { + return ListLatestResponse{}, err } resp := ListLatestResponse{ VideoList: feedVideos, @@ -97,28 +78,9 @@ func (f *FeedService) ListLikesCount(ctx context.Context, limit int, cursor *Lik return ListLikesCountResponse{}, err } hasMore := len(videos) == limit - feedVideos := make([]FeedVideoItem, 0, len(videos)) - for _, video := range videos { - var isLiked bool - if viewerAccountID == 0 { - isLiked = false - } else { - isLiked, err = f.likeRepo.IsLiked(ctx, video.ID, viewerAccountID) - if err != nil { - return ListLikesCountResponse{}, err - } - } - feedVideos = append(feedVideos, FeedVideoItem{ - ID: video.ID, - Author: FeedAuthor{ID: video.AuthorID, Username: video.Username}, - Title: video.Title, - Description: video.Description, - PlayURL: video.PlayURL, - CoverURL: video.CoverURL, - CreateTime: video.CreateTime.Unix(), - LikesCount: video.LikesCount, - IsLiked: isLiked, - }) + feedVideos, err := f.buildFeedVideos(ctx, videos, viewerAccountID) + if err != nil { + return ListLikesCountResponse{}, err } resp := ListLikesCountResponse{ VideoList: feedVideos, @@ -146,17 +108,29 @@ func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAcco nextTime = 0 } hasMore := len(videos) == limit + feedVideos, err := f.buildFeedVideos(ctx, videos, viewerAccountID) + if err != nil { + return ListByFollowingResponse{}, err + } + resp := ListByFollowingResponse{ + VideoList: feedVideos, + NextTime: nextTime, + HasMore: hasMore, + } + return resp, nil +} + +func (f *FeedService) buildFeedVideos(ctx context.Context, videos []*video.Video, viewerAccountID uint) ([]FeedVideoItem, error) { feedVideos := make([]FeedVideoItem, 0, len(videos)) + videoIDs := make([]uint, len(videos)) + for i, v := range videos { + videoIDs[i] = v.ID + } + likedMap, err := f.likeRepo.BatchGetLiked(ctx, videoIDs, viewerAccountID) + if err != nil { + return nil, err + } for _, video := range videos { - var isLiked bool - if viewerAccountID == 0 { - isLiked = false - } else { - isLiked, err = f.likeRepo.IsLiked(ctx, video.ID, viewerAccountID) - if err != nil { - return ListByFollowingResponse{}, err - } - } feedVideos = append(feedVideos, FeedVideoItem{ ID: video.ID, Author: FeedAuthor{ID: video.AuthorID, Username: video.Username}, @@ -166,13 +140,8 @@ func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAcco CoverURL: video.CoverURL, CreateTime: video.CreateTime.Unix(), LikesCount: video.LikesCount, - IsLiked: isLiked, + IsLiked: likedMap[video.ID], }) } - resp := ListByFollowingResponse{ - VideoList: feedVideos, - NextTime: nextTime, - HasMore: hasMore, - } - return resp, nil + return feedVideos, nil } diff --git a/internal/video/like_repo.go b/internal/video/like_repo.go index 51b2dfd..7db6362 100644 --- a/internal/video/like_repo.go +++ b/internal/video/like_repo.go @@ -34,3 +34,23 @@ func (r *LikeRepository) IsLiked(ctx context.Context, videoID, accountID uint) ( } return count > 0, nil } +func (r *LikeRepository) BatchGetLiked(ctx context.Context, videoIDs []uint, accountID uint) (map[uint]bool, error) { + likeMap := make(map[uint]bool) + if len(videoIDs) == 0 { + return likeMap, nil + } + if accountID == 0 { + return likeMap, nil + } + var likes []Like + err := r.db.WithContext(ctx).Model(&Like{}). + Where("video_id IN ? AND account_id = ?", videoIDs, accountID). + Find(&likes).Error + if err != nil { + return nil, err + } + for _, like := range likes { + likeMap[like.VideoID] = true + } + return likeMap, nil +}