diff --git a/models/organization/org_user.go b/models/organization/org_user.go index 81671c5cf5..8de301c6b0 100644 --- a/models/organization/org_user.go +++ b/models/organization/org_user.go @@ -136,3 +136,46 @@ func loadOrganizationOwners(ctx context.Context, users user_model.UserList, orgI } return ownerMaps, nil } + +// GetUserPublicMemberships returns a map of organization IDs to boolean values +// indicating whether the user's membership in each organization is public +func GetUserPublicMemberships(ctx context.Context, userID int64, orgIDs []int64) (map[int64]bool, error) { + result := make(map[int64]bool) + + // Set default value (not public) for all orgs + for _, orgID := range orgIDs { + result[orgID] = false + } + + if len(orgIDs) == 0 { + return result, nil + } + + type PublicMembership struct { + OrgID int64 `xorm:"org_id"` + } + + publicMemberships := make([]PublicMembership, 0, len(orgIDs)) + + sess := db.GetEngine(ctx). + Table("org_user"). + Where("uid = ?", userID). + And("is_public = ?", true) + + // Add the IN condition only if there are orgIDs + if len(orgIDs) > 0 { + sess = sess.In("org_id", orgIDs) + } + + err := sess.Cols("org_id").Find(&publicMemberships) + if err != nil { + return nil, err + } + + // Mark public memberships + for _, membership := range publicMemberships { + result[membership.OrgID] = true + } + + return result, nil +} diff --git a/routers/web/org/members.go b/routers/web/org/members.go index 57829dd1dc..f083afbe59 100644 --- a/routers/web/org/members.go +++ b/routers/web/org/members.go @@ -18,7 +18,7 @@ import ( const ( // tplMembers template for organization members page - tplMembers base.TplName = "org/member/members" + tplMembers base.TplName = "org/member/members" tplSettingsOrganization base.TplName = "/user/settings/organization" ) diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 167352dce6..e3dfe27b1c 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -217,13 +217,19 @@ func Organization(ctx *context.Context) { // Get public membership status for each organization orgsIsPublicMember := make(map[int64]bool) - for _, org := range orgs { - isPublic, err := organization.IsPublicMembership(ctx, org.ID, ctx.Doer.ID) + if len(orgs) > 0 { + // Extract all org IDs + orgIDs := make([]int64, 0, len(orgs)) + for _, org := range orgs { + orgIDs = append(orgIDs, org.ID) + } + + var err error + orgsIsPublicMember, err = organization.GetUserPublicMemberships(ctx, ctx.Doer.ID, orgIDs) if err != nil { - ctx.ServerError("IsPublicMembership", err) + ctx.ServerError("GetUserPublicMemberships", err) return } - orgsIsPublicMember[org.ID] = isPublic } ctx.Data["Orgs"] = orgs