这是我参与「第五届青训营 」伴学笔记创作活动的第 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
}
喜欢列表
需求
展示登录用户所有的点赞视频
-
基本流程
-
- 前端发出展示发布视频列表请求,后端收到请求,开始业务流程。
- rpc调用FavoriteService,根据当前user_id进入favorite表进行查询,将所有点赞过的video_id进行保存(此处根据点赞时间倒序排列,保证最近点赞的视频在最上面),rpc调用VideoService服务,根据video_id返回相关视频对象,同时rpc调用UserService,获取视频作者相关信息。
- 将视频信息、作者信息进行组装,后端回复前端。
业务流程图
/*
/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
}
```
```