@@ -427,20 +427,38 @@ func GetUserOrgsList(uid int64) ([]*MinimalOrg, error) {
427427// FindOrgOptions finds orgs options
428428type FindOrgOptions struct {
429429 ListOptions
430- UserID int64
431- IncludePrivate bool
430+ Actor * User
431+ UserID int64
432+ }
433+
434+ // queryOrgMembershipVisibleOrgIDs return query to only get org's of user who user is part of in public
435+ func queryOrgMembershipVisibleOrgIDs (actor * User ) * builder.Builder {
436+ if actor == nil {
437+ return builder .Select ("org_user.org_id" ).From ("org_user" ).Where (builder.Eq {"org_user.is_public" : true })
438+ }
439+ if actor .IsAdmin {
440+ return builder .Select ("org_user.org_id" ).From ("org_user" )
441+ }
442+ return builder .Select ("org_user.org_id" ).From ("org_user" ).Where (builder.Eq {"org_user.is_public" : true }).Or (builder.Eq {"org_user.uid" : actor .ID })
432443}
433444
434445func (opts FindOrgOptions ) toConds () builder.Cond {
435446 var cond = builder .NewCond ()
447+ cond = cond .And (builder .In ("`user`.`id`" , queryOrgMembershipVisibleOrgIDs (opts .Actor )))
436448 if opts .UserID > 0 {
437- // TODO: use queryUserOrgIDs()
438449 cond = cond .And (builder .In ("`user`.`id`" ,
439450 builder .Select ("org_user.org_id" ).
440451 From ("org_user" ).
441452 Where (builder.Eq {"org_user.uid" : opts .UserID })))
442453 }
443- if ! opts .IncludePrivate {
454+ if opts .Actor != nil {
455+ if ! opts .Actor .IsAdmin {
456+ cond = cond .And (builder .In ("`user`.visibility" , structs .VisibleTypePublic , structs .VisibleTypeLimited )).Or (builder .In ("`user`.`id`" ,
457+ builder .Select ("org_user.org_id" ).
458+ From ("org_user" ).
459+ Where (builder.Eq {"org_user.uid" : opts .Actor .ID })))
460+ }
461+ } else {
444462 cond = cond .And (builder.Eq {"`user`.visibility" : structs .VisibleTypePublic })
445463 }
446464 return cond
0 commit comments