@@ -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.
@@ -1231,3 +1239,36 @@ func GetAdminUser() (*User, error) {
1231
1239
1232
1240
return & admin , nil
1233
1241
}
1242
+
1243
+ func isUserVisibleToViewerCond (viewer * User ) builder.Cond {
1244
+ if viewer != nil && viewer .IsAdmin {
1245
+ return builder .NewCond ()
1246
+ }
1247
+
1248
+ if viewer == nil || viewer .IsRestricted {
1249
+ return builder.Eq {
1250
+ "`user`.visibility" : structs .VisibleTypePublic ,
1251
+ }
1252
+ }
1253
+
1254
+ return builder.Neq {
1255
+ "`user`.visibility" : structs .VisibleTypePrivate ,
1256
+ }.Or (
1257
+ builder .In ("`user`.id" ,
1258
+ builder .
1259
+ Select ("`follow`.user_id" ).
1260
+ From ("follow" ).
1261
+ Where (builder.Eq {"`follow`.follow_id" : viewer .ID })),
1262
+ builder .In ("`user`.id" ,
1263
+ builder .
1264
+ Select ("`team_user`.uid" ).
1265
+ From ("team_user" ).
1266
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.id = `t2`.id" ).
1267
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })),
1268
+ builder .In ("`user`.id" ,
1269
+ builder .
1270
+ Select ("`team_user`.uid" ).
1271
+ From ("team_user" ).
1272
+ Join ("INNER" , "`team_user` AS t2" , "`team_user`.org_id = `t2`.org_id" ).
1273
+ Where (builder.Eq {"`t2`.uid" : viewer .ID })))
1274
+ }
0 commit comments