@@ -316,37 +316,45 @@ func (u *User) GenerateEmailActivateCode(email string) string {
316
316
}
317
317
318
318
// GetUserFollowers returns range of user's followers.
319
- func GetUserFollowers (u * User , listOptions db.ListOptions ) ([]* User , error ) {
320
- sess := db .GetEngine (db .DefaultContext ).
319
+ func GetUserFollowers (ctx context.Context , u , viewer * User , listOptions db.ListOptions ) ([]* User , int64 , error ) {
320
+ sess := db .GetEngine (ctx ).
321
+ Select ("`user`.*" ).
322
+ Join ("LEFT" , "follow" , "`user`.id=follow.user_id" ).
321
323
Where ("follow.follow_id=?" , u .ID ).
322
- Join ( "LEFT" , "follow" , "`user`.id=follow.user_id" )
324
+ And ( isUserVisibleToViewerCond ( viewer ) )
323
325
324
326
if listOptions .Page != 0 {
325
327
sess = db .SetSessionPagination (sess , & listOptions )
326
328
327
329
users := make ([]* User , 0 , listOptions .PageSize )
328
- return users , sess .Find (& users )
330
+ count , err := sess .FindAndCount (& users )
331
+ return users , count , err
329
332
}
330
333
331
334
users := make ([]* User , 0 , 8 )
332
- return users , sess .Find (& users )
335
+ count , err := sess .FindAndCount (& users )
336
+ return users , count , err
333
337
}
334
338
335
339
// GetUserFollowing returns range of user's following.
336
- func GetUserFollowing (u * User , listOptions db.ListOptions ) ([]* User , error ) {
340
+ func GetUserFollowing (ctx context. Context , u , viewer * User , listOptions db.ListOptions ) ([]* User , int64 , error ) {
337
341
sess := db .GetEngine (db .DefaultContext ).
342
+ Select ("`user`.*" ).
343
+ Join ("LEFT" , "follow" , "`user`.id=follow.follow_id" ).
338
344
Where ("follow.user_id=?" , u .ID ).
339
- Join ( "LEFT" , "follow" , "`user`.id=follow.follow_id" )
345
+ And ( isUserVisibleToViewerCond ( viewer ) )
340
346
341
347
if listOptions .Page != 0 {
342
348
sess = db .SetSessionPagination (sess , & listOptions )
343
349
344
350
users := make ([]* User , 0 , listOptions .PageSize )
345
- return users , sess .Find (& users )
351
+ count , err := sess .FindAndCount (& users )
352
+ return users , count , err
346
353
}
347
354
348
355
users := make ([]* User , 0 , 8 )
349
- return users , sess .Find (& users )
356
+ count , err := sess .FindAndCount (& users )
357
+ return users , count , err
350
358
}
351
359
352
360
// NewGitSig generates and returns the signature of given user.
@@ -1219,6 +1227,43 @@ func GetAdminUser() (*User, error) {
1219
1227
return & admin , nil
1220
1228
}
1221
1229
1230
+ func isUserVisibleToViewerCond (viewer * User ) builder.Cond {
1231
+ cond := builder .NewCond ()
1232
+ if viewer != nil && viewer .IsAdmin {
1233
+ return cond
1234
+ }
1235
+ cond = builder.Eq {
1236
+ "`user`.Visibility" : structs .VisibleTypePublic ,
1237
+ }
1238
+
1239
+ if viewer == nil || viewer .IsRestricted {
1240
+ return cond
1241
+ }
1242
+
1243
+ cond = builder.Not {builder.Eq {
1244
+ "`user`.Visibility" : structs .VisibleTypePrivate ,
1245
+ }}.Or (
1246
+ builder .In ("`user`.id" ,
1247
+ builder .
1248
+ Select ("`follow`.user_id" ).
1249
+ From ("follow" ).
1250
+ Where (builder.Eq {"`follow`.follow_id" : viewer .ID })),
1251
+ builder .In ("`user`.id" ,
1252
+ builder .
1253
+ Select ("`team_user`.uid" ).
1254
+ From ("team_user" ).
1255
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.id = `t2`.id" ).
1256
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })),
1257
+ builder .In ("`user`.id" ,
1258
+ builder .
1259
+ Select ("`team_user`.uid" ).
1260
+ From ("team_user" ).
1261
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.org_id = `t2`.org_id" ).
1262
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })))
1263
+
1264
+ return cond
1265
+ }
1266
+
1222
1267
// IsUserVisibleToViewer check if viewer is able to see user profile
1223
1268
func IsUserVisibleToViewer (ctx context.Context , u , viewer * User ) bool {
1224
1269
if viewer != nil && viewer .IsAdmin {
0 commit comments