Skip to content

Calculate PublicOnly for org membership only once #32234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Nov 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f0348be
refactor: calculate if only public should be shown in a single place …
6543 Oct 7, 2024
3fd5962
create addTeamMatesOnlyFilter()
6543 Oct 7, 2024
340e8ea
Merge branch 'main' into limit-org-member-view-of-restricted-users
6543 Oct 10, 2024
4bcec1e
cleanup
6543 Oct 10, 2024
317176e
jup
6543 Oct 10, 2024
db511aa
Merge branch 'main' into refactor-of-32211
6543 Oct 11, 2024
4f38f65
no builder for now
6543 Oct 11, 2024
e79ef77
Revert "no builder for now"
6543 Oct 11, 2024
23f8b3b
fix
6543 Oct 11, 2024
695db86
fix test ...
6543 Oct 11, 2024
26d90b9
Merge branch 'main' into refactor-of-32211
6543 Oct 12, 2024
decaf7f
Merge branch 'main' into refactor-of-32211
6543 Oct 13, 2024
3af5ae7
try with less eslect
6543 Oct 14, 2024
6a26382
rename func to getUserTeamIDsQueryBuilder
6543 Oct 14, 2024
efcb63d
Revert "try with less eslect"
6543 Oct 14, 2024
aed72f4
Merge branch 'main' into refactor-of-32211
6543 Oct 15, 2024
0baab56
Merge branch 'main' into refactor-of-32211
6543 Oct 16, 2024
88b0add
Merge branch 'main' into refactor-of-32211
6543 Oct 18, 2024
4d9df45
Merge branch 'main' into refactor-of-32211
6543 Oct 20, 2024
12bd60b
Merge branch 'main' into refactor-of-32211
6543 Oct 22, 2024
7bb645e
not needed here and dublicated on related pull
6543 Oct 22, 2024
c4a53bc
Merge branch 'main' into refactor-of-32211
6543 Oct 23, 2024
5f6190c
Merge branch 'main' into refactor-of-32211
6543 Oct 25, 2024
c5dc0ad
rename
6543 Oct 27, 2024
ca0613b
Merge branch 'main' into refactor-of-32211
6543 Oct 28, 2024
ff53bcf
Merge branch 'main' into refactor-of-32211
6543 Oct 31, 2024
1828396
Merge branch 'main' into refactor-of-32211
6543 Nov 1, 2024
1d671af
Merge branch 'main' into refactor-of-32211
6543 Nov 9, 2024
840fab8
Merge branch 'main' into refactor-of-32211
6543 Nov 9, 2024
bf6c505
Merge branch 'main' into refactor-of-32211
6543 Nov 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions models/organization/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@ func (org *Organization) LoadTeams(ctx context.Context) ([]*Team, error) {
}

// GetMembers returns all members of organization.
func (org *Organization) GetMembers(ctx context.Context) (user_model.UserList, map[int64]bool, error) {
func (org *Organization) GetMembers(ctx context.Context, doer *user_model.User) (user_model.UserList, map[int64]bool, error) {
return FindOrgMembers(ctx, &FindOrgMembersOpts{
Doer: doer,
OrgID: org.ID,
})
}
Expand Down Expand Up @@ -195,16 +196,22 @@ func (org *Organization) CanCreateRepo() bool {
// FindOrgMembersOpts represensts find org members conditions
type FindOrgMembersOpts struct {
db.ListOptions
OrgID int64
PublicOnly bool
Doer *user_model.User
IsDoerMember bool
OrgID int64
}

func (opts FindOrgMembersOpts) PublicOnly() bool {
return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin)
}

// CountOrgMembers counts the organization's members
func CountOrgMembers(ctx context.Context, opts *FindOrgMembersOpts) (int64, error) {
sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID)
if opts.PublicOnly {
if opts.PublicOnly() {
sess.And("is_public = ?", true)
}

return sess.Count(new(OrgUser))
}

Expand Down Expand Up @@ -525,9 +532,10 @@ func GetOrgsCanCreateRepoByUserID(ctx context.Context, userID int64) ([]*Organiz
// GetOrgUsersByOrgID returns all organization-user relations by organization ID.
func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUser, error) {
sess := db.GetEngine(ctx).Where("org_id=?", opts.OrgID)
if opts.PublicOnly {
if opts.PublicOnly() {
sess.And("is_public = ?", true)
}

if opts.ListOptions.PageSize > 0 {
sess = db.SetSessionPagination(sess, opts)

Expand Down
58 changes: 32 additions & 26 deletions models/organization/org_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package organization_test

import (
"sort"
"testing"

"code.gitea.io/gitea/models/db"
Expand Down Expand Up @@ -103,7 +104,7 @@ func TestUser_GetTeams(t *testing.T) {
func TestUser_GetMembers(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
members, _, err := org.GetMembers(db.DefaultContext)
members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
assert.NoError(t, err)
if assert.Len(t, members, 3) {
assert.Equal(t, int64(2), members[0].ID)
Expand Down Expand Up @@ -210,37 +211,42 @@ func TestFindOrgs(t *testing.T) {
func TestGetOrgUsersByOrgID(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())

orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{
ListOptions: db.ListOptions{},
OrgID: 3,
PublicOnly: false,
opts := &organization.FindOrgMembersOpts{
Doer: &user_model.User{IsAdmin: true},
OrgID: 3,
}
assert.False(t, opts.PublicOnly())
orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, opts)
assert.NoError(t, err)
sort.Slice(orgUsers, func(i, j int) bool {
return orgUsers[i].ID < orgUsers[j].ID
})
assert.EqualValues(t, []*organization.OrgUser{{
ID: 1,
OrgID: 3,
UID: 2,
IsPublic: true,
}, {
ID: 2,
OrgID: 3,
UID: 4,
IsPublic: false,
}, {
ID: 9,
OrgID: 3,
UID: 28,
IsPublic: true,
}}, orgUsers)

opts = &organization.FindOrgMembersOpts{OrgID: 3}
assert.True(t, opts.PublicOnly())
orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, opts)
assert.NoError(t, err)
if assert.Len(t, orgUsers, 3) {
assert.Equal(t, organization.OrgUser{
ID: orgUsers[0].ID,
OrgID: 3,
UID: 2,
IsPublic: true,
}, *orgUsers[0])
assert.Equal(t, organization.OrgUser{
ID: orgUsers[1].ID,
OrgID: 3,
UID: 4,
IsPublic: false,
}, *orgUsers[1])
assert.Equal(t, organization.OrgUser{
ID: orgUsers[2].ID,
OrgID: 3,
UID: 28,
IsPublic: true,
}, *orgUsers[2])
}
assert.Len(t, orgUsers, 2)

orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{
ListOptions: db.ListOptions{},
OrgID: unittest.NonexistentID,
PublicOnly: false,
})
assert.NoError(t, err)
assert.Len(t, orgUsers, 0)
Expand Down
4 changes: 2 additions & 2 deletions models/organization/org_user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func TestUserListIsPublicMember(t *testing.T) {
func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) {
org, err := organization.GetOrgByID(db.DefaultContext, orgID)
assert.NoError(t, err)
_, membersIsPublic, err := org.GetMembers(db.DefaultContext)
_, membersIsPublic, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
assert.NoError(t, err)
assert.Equal(t, expected, membersIsPublic)
}
Expand All @@ -121,7 +121,7 @@ func TestUserListIsUserOrgOwner(t *testing.T) {
func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) {
org, err := organization.GetOrgByID(db.DefaultContext, orgID)
assert.NoError(t, err)
members, _, err := org.GetMembers(db.DefaultContext)
members, _, err := org.GetMembers(db.DefaultContext, &user_model.User{IsAdmin: true})
assert.NoError(t, err)
assert.Equal(t, expected, organization.IsUserOrgOwner(db.DefaultContext, members, orgID))
}
Expand Down
22 changes: 13 additions & 9 deletions routers/api/v1/org/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ import (
)

// listMembers list an organization's members
func listMembers(ctx *context.APIContext, publicOnly bool) {
func listMembers(ctx *context.APIContext, isMember bool) {
opts := &organization.FindOrgMembersOpts{
OrgID: ctx.Org.Organization.ID,
PublicOnly: publicOnly,
ListOptions: utils.GetListOptions(ctx),
Doer: ctx.Doer,
IsDoerMember: isMember,
OrgID: ctx.Org.Organization.ID,
ListOptions: utils.GetListOptions(ctx),
}

count, err := organization.CountOrgMembers(ctx, opts)
Expand Down Expand Up @@ -73,16 +74,19 @@ func ListMembers(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"

publicOnly := true
var (
isMember bool
err error
)

if ctx.Doer != nil {
isMember, err := ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID)
isMember, err = ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID)
if err != nil {
ctx.Error(http.StatusInternalServerError, "IsOrgMember", err)
return
}
publicOnly = !isMember && !ctx.Doer.IsAdmin
}
listMembers(ctx, publicOnly)
listMembers(ctx, isMember)
}

// ListPublicMembers list an organization's public members
Expand Down Expand Up @@ -112,7 +116,7 @@ func ListPublicMembers(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"

listMembers(ctx, true)
listMembers(ctx, false)
}

// IsMember check if a user is a member of an organization
Expand Down
8 changes: 5 additions & 3 deletions routers/web/org/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,12 @@ func home(ctx *context.Context, viewRepositories bool) {
}

opts := &organization.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: ctx.Org.PublicMemberOnly,
ListOptions: db.ListOptions{Page: 1, PageSize: 25},
Doer: ctx.Doer,
OrgID: org.ID,
IsDoerMember: ctx.Org.IsMember,
ListOptions: db.ListOptions{Page: 1, PageSize: 25},
}

members, _, err := organization.FindOrgMembers(ctx, opts)
if err != nil {
ctx.ServerError("FindOrgMembers", err)
Expand Down
8 changes: 4 additions & 4 deletions routers/web/org/members.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ func Members(ctx *context.Context) {
}

opts := &organization.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: true,
Doer: ctx.Doer,
OrgID: org.ID,
}

if ctx.Doer != nil {
Expand All @@ -44,9 +44,9 @@ func Members(ctx *context.Context) {
ctx.Error(http.StatusInternalServerError, "IsOrgMember")
return
}
opts.PublicOnly = !isMember && !ctx.Doer.IsAdmin
opts.IsDoerMember = isMember
}
ctx.Data["PublicOnly"] = opts.PublicOnly
ctx.Data["PublicOnly"] = opts.PublicOnly()

total, err := organization.CountOrgMembers(ctx, opts)
if err != nil {
Expand Down
7 changes: 3 additions & 4 deletions services/context/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ type Organization struct {
Organization *organization.Organization
OrgLink string
CanCreateOrgRepo bool
PublicMemberOnly bool // Only display public members

Team *organization.Team
Teams []*organization.Team
Expand Down Expand Up @@ -176,10 +175,10 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
ctx.Data["OrgLink"] = ctx.Org.OrgLink

// Member
ctx.Org.PublicMemberOnly = ctx.Doer == nil || !ctx.Org.IsMember && !ctx.Doer.IsAdmin
opts := &organization.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: ctx.Org.PublicMemberOnly,
Doer: ctx.Doer,
OrgID: org.ID,
IsDoerMember: ctx.Org.IsMember,
}
ctx.Data["NumMembers"], err = organization.CountOrgMembers(ctx, opts)
if err != nil {
Expand Down
Loading