@@ -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.
@@ -1222,6 +1230,39 @@ func GetAdminUser() (*User, error) {
1222
1230
return & admin , nil
1223
1231
}
1224
1232
1233
+ func isUserVisibleToViewerCond (viewer * User ) builder.Cond {
1234
+ if viewer != nil && viewer .IsAdmin {
1235
+ return builder .NewCond ()
1236
+ }
1237
+
1238
+ if viewer == nil || viewer .IsRestricted {
1239
+ return builder.Eq {
1240
+ "`user`.visibility" : structs .VisibleTypePublic ,
1241
+ }
1242
+ }
1243
+
1244
+ return builder.Neq {
1245
+ "`user`.visibility" : structs .VisibleTypePrivate ,
1246
+ }.Or (
1247
+ builder .In ("`user`.id" ,
1248
+ builder .
1249
+ Select ("`follow`.user_id" ).
1250
+ From ("follow" ).
1251
+ Where (builder.Eq {"`follow`.follow_id" : viewer .ID })),
1252
+ builder .In ("`user`.id" ,
1253
+ builder .
1254
+ Select ("`team_user`.uid" ).
1255
+ From ("team_user" ).
1256
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.id = `t2`.id" ).
1257
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })),
1258
+ builder .In ("`user`.id" ,
1259
+ builder .
1260
+ Select ("`team_user`.uid" ).
1261
+ From ("team_user" ).
1262
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.org_id = `t2`.org_id" ).
1263
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })))
1264
+ }
1265
+
1225
1266
// IsUserVisibleToViewer check if viewer is able to see user profile
1226
1267
func IsUserVisibleToViewer (ctx context.Context , u , viewer * User ) bool {
1227
1268
if viewer != nil && viewer .IsAdmin {
0 commit comments