-
Notifications
You must be signed in to change notification settings - Fork 5
/
real_timeQuery.go
201 lines (168 loc) · 4.86 KB
/
real_timeQuery.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package dao
import (
"context"
"github.com/sunflower10086/TikTok/http/internal/dao/db"
"github.com/sunflower10086/TikTok/http/internal/models"
)
/**
需要实时查询的有:
1.User:
关注总数
粉丝总数
作品数
获赞数量
喜欢数
是否被关注
2.Video:
点赞总数
评论总数
是否被点赞
对外暴露4个接口
func RealTimeUser(ctx context.Context, u *models.User) error 获取实时的User信息
func RealTimeVideo(ctx context.Context, v *models.Video) error 获取实时的Video信息
func CheckIsFavorite(ctx context.Context, videoID int64, userID int64) (bool, error) 判断关注关系
func CheckIsFollow(ctx context.Context, userID int64, followerID int64) (bool, error) 判断点赞关系
*/
// 获取实时用户信息
func RealTimeUser(ctx context.Context, u *models.User) error {
followCount, err := calFollowCount(ctx, u.ID)
if err != nil {
return err
}
followerCount, err := calFollowerCount(ctx, u.ID)
if err != nil {
return err
}
workCount, err := calWorkCount(ctx, u.ID)
if err != nil {
return err
}
totalFavorited, err := calTotalFavorited(ctx, u.ID)
if err != nil {
return err
}
userFavoriteCount, err := calUserFavoriteCount(ctx, u.ID)
if err != nil {
return err
}
u.OtherInfo.FollowCount = followCount
u.OtherInfo.FollowerCount = followerCount
u.OtherInfo.WorkCount = workCount
u.OtherInfo.TotalFavorited = totalFavorited
u.OtherInfo.FavoriteCount = userFavoriteCount
return nil
}
// 获取实时视频信息
func RealTimeVideo(ctx context.Context, v *models.Video) error {
videoFavoriteCount, err := calVideoFavoriteCount(ctx, v.ID)
if err != nil {
return err
}
commentCount, err := calCommentCount(ctx, v.ID)
if err != nil {
return err
}
v.FavoriteCount = videoFavoriteCount
v.CommentCount = commentCount
return nil
}
// 判断当前视频是否被当前用户点赞
func CheckIsFavorite(ctx context.Context, videoID int64, userID int64) (bool, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Table("user_favorite").Where("user_id = ? and video_id = ?", userID, videoID).Count(&count).Error
if err != nil {
return false, err
}
return count == 1, nil
}
// 判断某用户是否被当前用户关注
func CheckIsFollow(ctx context.Context, userID int64, followerID int64) (bool, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Table("user_follower").Where("user_id = ? and follower_id = ?", userID, followerID).Count(&count).Error
if err != nil {
return false, err
}
return count == 1, nil
}
// 计算视频的总点赞数
func calVideoFavoriteCount(ctx context.Context, videoID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64
err := conn.Table("user_favorite").Where("video_id = ?", videoID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算视频的总评论数
func calCommentCount(ctx context.Context, videoID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64
err := conn.Model(&models.Comment{}).Where("video_id = ?", videoID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算用户的关注总数
func calFollowCount(ctx context.Context, followerID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Table("user_follower").Where("follower_id = ?", followerID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算用户的粉丝总数
func calFollowerCount(ctx context.Context, userID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Table("user_follower").Where("user_id = ?", userID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算用户的作品数
func calWorkCount(ctx context.Context, userID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Model(&models.Video{}).Where("author_id = ?", userID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算用户的喜欢数
func calUserFavoriteCount(ctx context.Context, userID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
err := conn.Table("user_favorite").Where("user_id = ?", userID).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 计算用户的获赞数量
func calTotalFavorited(ctx context.Context, userID int64) (int64, error) {
conn := db.GetDB().WithContext(ctx)
var count int64 = 0
var videoID []int64
// 查询用户所有作品的videoID
err := conn.Model(&models.Video{}).Where("author_id = ?", userID).Pluck("id", &videoID).Error
if err != nil {
return 0, err
}
// 累加每个视频的点赞数
for _, ID := range videoID {
c, err := calVideoFavoriteCount(ctx, ID)
if err != nil {
return 0, err
}
count += c
}
return count, err
}