@@ -316,37 +316,45 @@ func (u *User) GenerateEmailActivateCode(email string) string {
316316}
317317
318318// 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" ).
321323 Where ("follow.follow_id=?" , u .ID ).
322- Join ( "LEFT" , "follow" , "`user`.id=follow.user_id" )
324+ And ( isUserVisibleToViewerCond ( viewer ) )
323325
324326 if listOptions .Page != 0 {
325327 sess = db .SetSessionPagination (sess , & listOptions )
326328
327329 users := make ([]* User , 0 , listOptions .PageSize )
328- return users , sess .Find (& users )
330+ count , err := sess .FindAndCount (& users )
331+ return users , count , err
329332 }
330333
331334 users := make ([]* User , 0 , 8 )
332- return users , sess .Find (& users )
335+ count , err := sess .FindAndCount (& users )
336+ return users , count , err
333337}
334338
335339// 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 ) {
337341 sess := db .GetEngine (db .DefaultContext ).
342+ Select ("`user`.*" ).
343+ Join ("LEFT" , "follow" , "`user`.id=follow.follow_id" ).
338344 Where ("follow.user_id=?" , u .ID ).
339- Join ( "LEFT" , "follow" , "`user`.id=follow.follow_id" )
345+ And ( isUserVisibleToViewerCond ( viewer ) )
340346
341347 if listOptions .Page != 0 {
342348 sess = db .SetSessionPagination (sess , & listOptions )
343349
344350 users := make ([]* User , 0 , listOptions .PageSize )
345- return users , sess .Find (& users )
351+ count , err := sess .FindAndCount (& users )
352+ return users , count , err
346353 }
347354
348355 users := make ([]* User , 0 , 8 )
349- return users , sess .Find (& users )
356+ count , err := sess .FindAndCount (& users )
357+ return users , count , err
350358}
351359
352360// NewGitSig generates and returns the signature of given user.
@@ -1222,6 +1230,39 @@ func GetAdminUser() (*User, error) {
12221230 return & admin , nil
12231231}
12241232
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+
12251266// IsUserVisibleToViewer check if viewer is able to see user profile
12261267func IsUserVisibleToViewer (ctx context.Context , u , viewer * User ) bool {
12271268 if viewer != nil && viewer .IsAdmin {
0 commit comments