84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package video
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type LikeService struct {
|
|
repo *LikeRepository
|
|
VideoRepo *VideoRepository
|
|
}
|
|
|
|
func NewLikeService(repo *LikeRepository, videoRepo *VideoRepository) *LikeService {
|
|
return &LikeService{repo: repo, VideoRepo: videoRepo}
|
|
}
|
|
|
|
func (s *LikeService) Like(ctx context.Context, like *Like) error {
|
|
exists, err := s.VideoRepo.IsExist(ctx, like.VideoID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !exists {
|
|
return errors.New("video not found")
|
|
}
|
|
|
|
isLiked, err := s.IsLiked(ctx, like.VideoID, like.AccountID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if isLiked {
|
|
return errors.New("user has liked this video")
|
|
}
|
|
like.CreatedAt = time.Now()
|
|
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 {
|
|
exists, err := s.VideoRepo.IsExist(ctx, like.VideoID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !exists {
|
|
return errors.New("video not found")
|
|
}
|
|
|
|
isLiked, err := s.IsLiked(ctx, like.VideoID, like.AccountID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isLiked {
|
|
return errors.New("user has not liked this video")
|
|
}
|
|
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) {
|
|
return s.repo.IsLiked(ctx, videoID, accountID)
|
|
}
|
|
|
|
func (s *LikeService) GetLikesCount(ctx context.Context, videoID uint) (int64, error) {
|
|
return s.repo.GetLikesCount(ctx, videoID)
|
|
}
|