refactor: 优化islLked的获取方式并将部分相同代码提取为一个函数

This commit is contained in:
Leon
2025-12-23 18:45:39 +08:00
parent 23b4babc23
commit f884167db8
3 changed files with 56 additions and 67 deletions

View File

@@ -17,8 +17,8 @@ func NewFeedRepository(db *gorm.DB) *FeedRepository {
return &FeedRepository{db: db} return &FeedRepository{db: db}
} }
func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBefore time.Time) ([]video.Video, error) { func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBefore time.Time) ([]*video.Video, error) {
var videos []video.Video var videos []*video.Video
query := repo.db.WithContext(ctx).Model(&video.Video{}). query := repo.db.WithContext(ctx).Model(&video.Video{}).
Order("create_time DESC") Order("create_time DESC")
if !latestBefore.IsZero() { if !latestBefore.IsZero() {
@@ -30,8 +30,8 @@ func (repo *FeedRepository) ListLatest(ctx context.Context, limit int, latestBef
return videos, nil return videos, nil
} }
func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit int, cursor *LikesCountCursor) ([]video.Video, error) { func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit int, cursor *LikesCountCursor) ([]*video.Video, error) {
var videos []video.Video var videos []*video.Video
query := repo.db.WithContext(ctx).Model(&video.Video{}). query := repo.db.WithContext(ctx).Model(&video.Video{}).
Order("likes_count DESC, id DESC") Order("likes_count DESC, id DESC")
@@ -49,8 +49,8 @@ func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit
return videos, nil return videos, nil
} }
func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) ([]video.Video, error) { func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) ([]*video.Video, error) {
var videos []video.Video var videos []*video.Video
query := repo.db.WithContext(ctx).Model(&video.Video{}). query := repo.db.WithContext(ctx).Model(&video.Video{}).
Order("create_time DESC") Order("create_time DESC")
if viewerAccountID > 0 { if viewerAccountID > 0 {

View File

@@ -3,9 +3,9 @@ package feed
import ( import (
"context" "context"
"encoding/json" "encoding/json"
rediscache "feedsystem_video_go/internal/redis"
"feedsystem_video_go/internal/video" "feedsystem_video_go/internal/video"
"fmt" "fmt"
rediscache "feedsystem_video_go/internal/redis"
"time" "time"
) )
@@ -52,28 +52,9 @@ func (f *FeedService) ListLatest(ctx context.Context, limit int, latestBefore ti
nextTime = 0 nextTime = 0
} }
hasMore := len(videos) == limit hasMore := len(videos) == limit
feedVideos := make([]FeedVideoItem, 0, len(videos)) feedVideos, err := f.buildFeedVideos(ctx, videos, viewerAccountID)
for _, video := range videos { if err != nil {
var isLiked bool return ListLatestResponse{}, err
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,
})
} }
resp := ListLatestResponse{ resp := ListLatestResponse{
VideoList: feedVideos, VideoList: feedVideos,
@@ -97,28 +78,9 @@ func (f *FeedService) ListLikesCount(ctx context.Context, limit int, cursor *Lik
return ListLikesCountResponse{}, err return ListLikesCountResponse{}, err
} }
hasMore := len(videos) == limit hasMore := len(videos) == limit
feedVideos := make([]FeedVideoItem, 0, len(videos)) feedVideos, err := f.buildFeedVideos(ctx, videos, viewerAccountID)
for _, video := range videos { if err != nil {
var isLiked bool return ListLikesCountResponse{}, err
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,
})
} }
resp := ListLikesCountResponse{ resp := ListLikesCountResponse{
VideoList: feedVideos, VideoList: feedVideos,
@@ -146,17 +108,29 @@ func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAcco
nextTime = 0 nextTime = 0
} }
hasMore := len(videos) == limit 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)) 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 { 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{ feedVideos = append(feedVideos, FeedVideoItem{
ID: video.ID, ID: video.ID,
Author: FeedAuthor{ID: video.AuthorID, Username: video.Username}, 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, CoverURL: video.CoverURL,
CreateTime: video.CreateTime.Unix(), CreateTime: video.CreateTime.Unix(),
LikesCount: video.LikesCount, LikesCount: video.LikesCount,
IsLiked: isLiked, IsLiked: likedMap[video.ID],
}) })
} }
resp := ListByFollowingResponse{ return feedVideos, nil
VideoList: feedVideos,
NextTime: nextTime,
HasMore: hasMore,
}
return resp, nil
} }

View File

@@ -34,3 +34,23 @@ func (r *LikeRepository) IsLiked(ctx context.Context, videoID, accountID uint) (
} }
return count > 0, nil 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
}