抖音大项目互动模块介绍| 青训营笔记

137 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

互动方向

赞操作

接上一篇文章代码

/*
    /cmd/favorite/dal/db/db.go
*/

func UpdateFavourite(ctx context.Context, request *douyinfavorite.DouyinFavoriteActionRequest, userid int64) (bool, error) {
   var fav Favorite_db
   var video db.Video_db
    
   /*
       
       1.首先判断video_id是否存在,之后根据action_type对video的Favorite_count将进行更新
       2.进行边界条件判断(已赞不可再赞,无赞不可取消),之后根据action_type对点赞关系进行更新。
       
   */

   videoExist := DB.WithContext(ctx).Where("id = ?", request.VideoId).Find(&video)
   if videoExist.Error != nil {
      log.Print(videoExist.Error)
      return false, videoExist.Error
   }

   if videoExist.RowsAffected == 0 {
      log.Print("video_id doesn't exist!")
      return false, nil
   }

   //需要更新两个表,更新videob表中视频点赞的数量,更新favourite报表中user_id以及video_id的关系
   //点赞
   if request.ActionType == 1 { 
      fav.UserId = userid
      fav.VideoId = request.VideoId
      res := DB.WithContext(ctx).Where("user_id = ? AND video_id = ?", fav.UserId, fav.VideoId).Find(&fav)
      if res.RowsAffected > 0 {
         log.Print("already liked!!!!")
         return false, nil
      }
      fav.UserId = userid
      fav.VideoId = request.VideoId
      fav.FavoriteTime = time.Now().Unix()
      resultFavorite := DB.WithContext(ctx).Create(&fav)

      if resultFavorite.Error != nil {
         log.Print(resultFavorite.Error)
         return false, resultFavorite.Error
      }

      fav.UserId = userid
      fav.VideoId = request.VideoId
      result := DB.WithContext(ctx).Model(&video).Where("id = ?", request.VideoId).
         Update("favourite_count", gorm.Expr("favourite_count + ?", 1))
      if result.Error != nil {
         log.Print(result.Error)
         return false, result.Error
      }

   } else if request.ActionType == 2 { //取消点赞
      fav.UserId = userid
      fav.VideoId = request.VideoId
      res := DB.WithContext(ctx).Where("user_id = ? ", fav.UserId).Find(&fav)
      if res.RowsAffected == 0 {
         log.Print("can't cancel like!!!!")
         return false, nil
      }
      fav.UserId = userid
      fav.VideoId = request.VideoId
      resultFavorite := DB.WithContext(ctx).Where("user_id = ? AND video_id = ?", fav.UserId, fav.VideoId).Delete(&fav)

      if resultFavorite.Error != nil {
         log.Print(resultFavorite.Error)
         return false, resultFavorite.Error
      }
      fav.UserId = userid
      fav.VideoId = request.VideoId
      result := DB.WithContext(ctx).Model(&video).Where("id = ?", request.VideoId).
         Update("favourite_count", gorm.Expr("favourite_count - ?", 1))
      if result.Error != nil {
         log.Print(result.Error)
         return false, result.Error
      }

   } else {
      log.Print("wrong action type")
      return false, nil
   }
   return true, nil
}
喜欢列表
需求

展示登录用户所有的点赞视频

  • 基本流程
    1. 前端发出展示发布视频列表请求,后端收到请求,开始业务流程。
    2. rpc调用FavoriteService,根据当前user_id进入favorite表进行查询,将所有点赞过的video_id进行保存(此处根据点赞时间倒序排列,保证最近点赞的视频在最上面),rpc调用VideoService服务,根据video_id返回相关视频对象,同时rpc调用UserService,获取视频作者相关信息。
    3. 将视频信息、作者信息进行组装,后端回复前端。
业务流程图

image.png

/*
    /cmd/favorite/service/favorite_list.go
*/
type FavouriteListService struct {
   ctx context.Context
}

func NewFavouriteListService(ctx context.Context) *FavouriteListService {
   return &FavouriteListService{ctx: ctx}
}

func (f *FavouriteListService) FavouriteList(req *douyinfavorite.DouyinFavoriteListRequest) ([]*douyinfavorite.Video, error) {

    /*
        1.根据user_id查询用户点赞过的视频的video_id
        2.rpc调用VideoService,获取视频信息
    */

   videoIds, err := db.QueryFavoriteVideoByUserId(f.ctx, req)
   if err != nil {
      return nil, err
   }
   //获取视频相关信息
   videoList, err := rpc.GetFavoriteList(context.Background(), &douyinvideo.DouyinFavoriteListRequest{
      VideoId: *videoIds,
      UserId:  req.UserId,
   })
   if err != nil {
      return nil, err
   }
   //组装video和user
   fVideo := pack.DouyinVideoToDouyinFavoriteVideo(videoList)
   

   return fVideo, nil
}
```
```