From 8e51de9410abb26841c33d51b7b69f46e776f822 Mon Sep 17 00:00:00 2001 From: Leon <147289645+LeoninCS@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:11:29 +0800 Subject: [PATCH] feat(video): add likescount and updatelikescount --- internal/http/router.go | 2 +- internal/video/like_service.go | 31 ++++++++++++++++++++++++++----- internal/video/video_entity.go | 2 ++ internal/video/video_handler.go | 20 ++++++++++++++++++++ internal/video/video_repo.go | 9 +++++++++ internal/video/video_service.go | 10 ++++++++++ 6 files changed, 68 insertions(+), 6 deletions(-) diff --git a/internal/http/router.go b/internal/http/router.go index 1f1cd55..dcc5d2e 100644 --- a/internal/http/router.go +++ b/internal/http/router.go @@ -46,7 +46,7 @@ func SetRouter(db *gorm.DB) *gin.Engine { } // like likeRepository := video.NewLikeRepository(db) - likeService := video.NewLikeService(likeRepository) + likeService := video.NewLikeService(likeRepository, videoRepository) likeHandler := video.NewLikeHandler(likeService) likeGroup := r.Group("/like") { diff --git a/internal/video/like_service.go b/internal/video/like_service.go index 1419513..51a7e9a 100644 --- a/internal/video/like_service.go +++ b/internal/video/like_service.go @@ -7,11 +7,12 @@ import ( ) type LikeService struct { - repo *LikeRepository + repo *LikeRepository + VideoRepo *VideoRepository } -func NewLikeService(repo *LikeRepository) *LikeService { - return &LikeService{repo: repo} +func NewLikeService(repo *LikeRepository, videoRepo *VideoRepository) *LikeService { + return &LikeService{repo: repo, VideoRepo: videoRepo} } func (s *LikeService) Like(ctx context.Context, like *Like) error { @@ -19,14 +20,34 @@ func (s *LikeService) Like(ctx context.Context, like *Like) error { return errors.New("user has liked this video") } like.CreatedAt = time.Now() - return s.repo.Like(ctx, like) + if err := s.repo.Like(ctx, like); err != nil { + return err + } + likesCount, err := s.GetLikesCount(ctx, like.VideoID) + if err != nil { + return err + } + if err := s.VideoRepo.UpdateLikesCount(ctx, like.VideoID, likesCount); err != nil { + return err + } + return nil } func (s *LikeService) Unlike(ctx context.Context, like *Like) error { if isLiked, err := s.IsLiked(ctx, like.VideoID, like.AccountID); err == nil && !isLiked { return errors.New("user has not liked this video") } - return s.repo.Unlike(ctx, like) + if err := s.repo.Unlike(ctx, like); err != nil { + return err + } + likesCount, err := s.GetLikesCount(ctx, like.VideoID) + if err != nil { + return err + } + if err := s.VideoRepo.UpdateLikesCount(ctx, like.VideoID, likesCount); err != nil { + return err + } + return nil } func (s *LikeService) IsLiked(ctx context.Context, videoID, accountID uint) (bool, error) { diff --git a/internal/video/video_entity.go b/internal/video/video_entity.go index 3b84850..1263754 100644 --- a/internal/video/video_entity.go +++ b/internal/video/video_entity.go @@ -8,5 +8,7 @@ type Video struct { Title string `gorm:"type:varchar(255);not null"` Description string `gorm:"type:varchar(255);"` PlayURL string `gorm:"type:varchar(255);not null"` + CoverURL string `gorm:"type:varchar(255);not null"` CreateTime time.Time `gorm:"autoCreateTime"` + LikesCount int64 `gorm:"column:likes_count;not null;default:0" json:"likes_count"` } diff --git a/internal/video/video_handler.go b/internal/video/video_handler.go index 2456776..8090239 100644 --- a/internal/video/video_handler.go +++ b/internal/video/video_handler.go @@ -18,6 +18,7 @@ type PublishVideoRequest struct { Title string `json:"title"` Description string `json:"description"` PlayURL string `json:"play_url"` + CoverURL string `json:"cover_url"` } type ListByAuthorIDRequest struct { @@ -28,6 +29,11 @@ type GetDetailRequest struct { ID uint `json:"id"` } +type UpdateLikesCountRequest struct { + ID uint `json:"id"` + LikesCount int64 `json:"likes_count"` +} + func (vh *VideoHandler) PublishVideo(c *gin.Context) { var req PublishVideoRequest if err := c.ShouldBindJSON(&req); err != nil { @@ -50,6 +56,7 @@ func (vh *VideoHandler) PublishVideo(c *gin.Context) { Title: req.Title, Description: req.Description, PlayURL: req.PlayURL, + CoverURL: req.CoverURL, CreateTime: time.Now(), } if err := vh.service.Publish(c.Request.Context(), video); err != nil { @@ -86,3 +93,16 @@ func (vh *VideoHandler) GetDetail(c *gin.Context) { } c.JSON(200, video) } + +func (vh *VideoHandler) UpdateLikesCount(c *gin.Context) { + var req UpdateLikesCountRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + if err := vh.service.UpdateLikesCount(c.Request.Context(), req.ID, req.LikesCount); err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + c.JSON(200, gin.H{"message": "likes count updated"}) +} diff --git a/internal/video/video_repo.go b/internal/video/video_repo.go index 2b18561..725fc84 100644 --- a/internal/video/video_repo.go +++ b/internal/video/video_repo.go @@ -40,3 +40,12 @@ func (vr *VideoRepository) GetByID(ctx context.Context, id uint) (*Video, error) } return &video, nil } + +func (vr *VideoRepository) UpdateLikesCount(ctx context.Context, id uint, likesCount int64) error { + if err := vr.db.WithContext(ctx).Model(&Video{}). + Where("id = ?", id). + Update("likes_count", likesCount).Error; err != nil { + return err + } + return nil +} diff --git a/internal/video/video_service.go b/internal/video/video_service.go index 8d6c116..ee25d6e 100644 --- a/internal/video/video_service.go +++ b/internal/video/video_service.go @@ -20,6 +20,9 @@ func (vs *VideoService) Publish(ctx context.Context, video *Video) error { if video.PlayURL == "" { return errors.New("play url is required") } + if video.CoverURL == "" { + return errors.New("cover url is required") + } if err := vs.repo.CreateVideo(ctx, video); err != nil { return err } @@ -41,3 +44,10 @@ func (vs *VideoService) GetDetail(ctx context.Context, id uint) (*Video, error) } return video, nil } + +func (vs *VideoService) UpdateLikesCount(ctx context.Context, id uint, likesCount int64) error { + if err := vs.repo.UpdateLikesCount(ctx, id, likesCount); err != nil { + return err + } + return nil +}