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