Files
VLoop/internal/feed/service.go
2025-12-19 19:20:52 +08:00

144 lines
3.9 KiB
Go

package feed
import (
"context"
"feedsystem_video_go/internal/video"
"time"
)
type FeedService struct {
repo *FeedRepository
likeRepo *video.LikeRepository
}
func NewFeedService(repo *FeedRepository, likeRepo *video.LikeRepository) *FeedService {
return &FeedService{repo: repo, likeRepo: likeRepo}
}
func (f *FeedService) ListLatest(ctx context.Context, limit int, latestBefore time.Time, viewerAccountID uint) (ListLatestResponse, error) {
videos, err := f.repo.ListLatest(ctx, limit, latestBefore)
if err != nil {
return ListLatestResponse{}, err
}
var nextTime int64
if len(videos) > 0 {
nextTime = videos[len(videos)-1].CreateTime.Unix()
} else {
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,
})
}
resp := ListLatestResponse{
VideoList: feedVideos,
NextTime: nextTime,
HasMore: hasMore,
}
return resp, nil
}
func (f *FeedService) ListLikesCount(ctx context.Context, limit int, likesCountBefore int64, viewerAccountID uint) (ListLikesCountResponse, error) {
videos, err := f.repo.ListLikesCount(ctx, limit, likesCountBefore)
if err != nil {
return ListLikesCountResponse{}, err
}
var nextLikesCountBefore int64
if len(videos) > 0 {
nextLikesCountBefore = videos[len(videos)-1].LikesCount
} else {
nextLikesCountBefore = 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 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,
LikesCount: video.LikesCount,
IsLiked: isLiked,
})
}
resp := ListLikesCountResponse{
VideoList: feedVideos,
NextLikesCountBefore: nextLikesCountBefore,
HasMore: hasMore,
}
return resp, nil
}
func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) (ListByFollowingResponse, error) {
videos, err := f.repo.ListByFollowing(ctx, limit, viewerAccountID)
if err != nil {
return ListByFollowingResponse{}, err
}
var nextTime int64
if len(videos) > 0 {
nextTime = videos[len(videos)-1].CreateTime.Unix()
} else {
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 ListByFollowingResponse{}, 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,
LikesCount: video.LikesCount,
IsLiked: isLiked,
})
}
resp := ListByFollowingResponse{
VideoList: feedVideos,
NextTime: nextTime,
HasMore: hasMore,
}
return resp, nil
}