refactor: 优化islLked的获取方式并将部分相同代码提取为一个函数
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user