From f0348be27e19b0dcd69dbe2842fc26639e5603fb Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 7 Oct 2024 21:12:14 +0200 Subject: [PATCH 01/13] refactor: calculate if only public should be shown in a single place next the the opts --- models/organization/org.go | 18 +++++++++++++----- models/organization/org_test.go | 4 +--- models/organization/org_user_test.go | 4 ++-- routers/api/v1/org/member.go | 18 +++++++++++------- routers/web/org/home.go | 4 +++- routers/web/org/members.go | 8 ++++---- services/context/org.go | 7 +++---- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index b33d15d29c129..19b6f51e9b969 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -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, }) } @@ -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 + IsMember bool + OrgID int64 +} + +func (opts FindOrgMembersOpts) PublicOnly() bool { + return opts.Doer == nil || !opts.IsMember && !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)) } @@ -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) diff --git a/models/organization/org_test.go b/models/organization/org_test.go index 23ef22e2fbaa4..33821fb1ceb7f 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -103,7 +103,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) @@ -213,7 +213,6 @@ func TestGetOrgUsersByOrgID(t *testing.T) { orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ ListOptions: db.ListOptions{}, OrgID: 3, - PublicOnly: false, }) assert.NoError(t, err) if assert.Len(t, orgUsers, 3) { @@ -240,7 +239,6 @@ func TestGetOrgUsersByOrgID(t *testing.T) { 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) diff --git a/models/organization/org_user_test.go b/models/organization/org_user_test.go index cf7acdf83ba79..55abb63203e86 100644 --- a/models/organization/org_user_test.go +++ b/models/organization/org_user_test.go @@ -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) } @@ -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)) } diff --git a/routers/api/v1/org/member.go b/routers/api/v1/org/member.go index 9db9ad964b6bf..021526fc6f0fd 100644 --- a/routers/api/v1/org/member.go +++ b/routers/api/v1/org/member.go @@ -18,10 +18,11 @@ import ( ) // listMembers list an organization's members -func listMembers(ctx *context.APIContext, publicOnly bool) { +func listMembers(ctx *context.APIContext, isMember bool) { opts := &organization.FindOrgMembersOpts{ + Doer: ctx.Doer, + IsMember: isMember, OrgID: ctx.Org.Organization.ID, - PublicOnly: publicOnly, ListOptions: utils.GetListOptions(ctx), } @@ -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 @@ -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 diff --git a/routers/web/org/home.go b/routers/web/org/home.go index 069bd549c1a2f..986088faebebb 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -95,10 +95,12 @@ func home(ctx *context.Context, viewRepositories bool) { } opts := &organization.FindOrgMembersOpts{ + Doer: ctx.Doer, OrgID: org.ID, - PublicOnly: ctx.Org.PublicMemberOnly, + IsMember: ctx.Org.IsMember, ListOptions: db.ListOptions{Page: 1, PageSize: 25}, } + members, _, err := organization.FindOrgMembers(ctx, opts) if err != nil { ctx.ServerError("FindOrgMembers", err) diff --git a/routers/web/org/members.go b/routers/web/org/members.go index 8ff75b0651112..5f39d45325918 100644 --- a/routers/web/org/members.go +++ b/routers/web/org/members.go @@ -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 { @@ -44,9 +44,9 @@ func Members(ctx *context.Context) { ctx.Error(http.StatusInternalServerError, "IsOrgMember") return } - opts.PublicOnly = !isMember && !ctx.Doer.IsAdmin + opts.IsMember = isMember } - ctx.Data["PublicOnly"] = opts.PublicOnly + ctx.Data["PublicOnly"] = opts.PublicOnly() total, err := organization.CountOrgMembers(ctx, opts) if err != nil { diff --git a/services/context/org.go b/services/context/org.go index 7eba80ff96b1f..4500e595e1121 100644 --- a/services/context/org.go +++ b/services/context/org.go @@ -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 @@ -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, + IsMember: ctx.Org.IsMember, } ctx.Data["NumMembers"], err = organization.CountOrgMembers(ctx, opts) if err != nil { From 3fd5962cc87a1cf1820c0c942da0fcd1ca06d7a9 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 7 Oct 2024 21:41:20 +0200 Subject: [PATCH 02/13] create addTeamMatesOnlyFilter() --- models/organization/org.go | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index 19b6f51e9b969..07e689669f65a 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -22,6 +22,7 @@ import ( "code.gitea.io/gitea/modules/util" "xorm.io/builder" + "xorm.io/xorm" ) // ________ .__ __ .__ @@ -205,12 +206,27 @@ func (opts FindOrgMembersOpts) PublicOnly() bool { return opts.Doer == nil || !opts.IsMember && !opts.Doer.IsAdmin } +func (opts FindOrgMembersOpts) addTeamMatesOnlyFilter(ctx context.Context, sess *xorm.Session) error { + if opts.Doer != nil && opts.IsMember && opts.Doer.IsRestricted { + teamMates := builder.Select("DISTINCT team_user.uid"). + From("team_user"). + Where(builder.In("team_user.team_id", userTeamIDbuilder(opts.OrgID, opts.Doer.ID))). + And(builder.Eq{"team_user.org_id": opts.OrgID}) + + sess.In("org_user.uid", teamMates) + } + return nil +} + // 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() { sess.And("is_public = ?", true) } + if err := opts.addTeamMatesOnlyFilter(ctx, sess); err != nil { + return 0, err + } return sess.Count(new(OrgUser)) } @@ -535,6 +551,9 @@ func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUs if opts.PublicOnly() { sess.And("is_public = ?", true) } + if err := opts.addTeamMatesOnlyFilter(ctx, sess); err != nil { + return nil, err + } if opts.ListOptions.PageSize > 0 { sess = db.SetSessionPagination(sess, opts) @@ -658,12 +677,19 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in return teamIDs, db.GetEngine(ctx). Table("team"). Cols("team.id"). - Where("`team_user`.org_id = ?", org.ID). - Join("INNER", "team_user", "`team_user`.team_id = team.id"). - And("`team_user`.uid = ?", userID). + Where(userTeamIDbuilder(org.ID, userID)). Find(&teamIDs) } +func userTeamIDbuilder(orgID, userID int64) *builder.Builder { + return builder.Select("team.id").From("team"). + InnerJoin("team_user", "team_user.team_id = team.id"). + Where(builder.Eq{ + "team_user.org_id": orgID, + "team_user.uid": userID, + }) +} + // TeamsWithAccessToRepo returns all teams that have given access level to the repository. func (org *Organization) TeamsWithAccessToRepo(ctx context.Context, repoID int64, mode perm.AccessMode) ([]*Team, error) { return GetTeamsWithAccessToRepo(ctx, org.ID, repoID, mode) From 4bcec1e3d06bcaca54870f3e69e75bb7bbb25d5c Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Thu, 10 Oct 2024 17:24:48 +0200 Subject: [PATCH 03/13] cleanup --- models/organization/org.go | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index 07e689669f65a..54896e8d05d6f 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -22,7 +22,6 @@ import ( "code.gitea.io/gitea/modules/util" "xorm.io/builder" - "xorm.io/xorm" ) // ________ .__ __ .__ @@ -206,27 +205,12 @@ func (opts FindOrgMembersOpts) PublicOnly() bool { return opts.Doer == nil || !opts.IsMember && !opts.Doer.IsAdmin } -func (opts FindOrgMembersOpts) addTeamMatesOnlyFilter(ctx context.Context, sess *xorm.Session) error { - if opts.Doer != nil && opts.IsMember && opts.Doer.IsRestricted { - teamMates := builder.Select("DISTINCT team_user.uid"). - From("team_user"). - Where(builder.In("team_user.team_id", userTeamIDbuilder(opts.OrgID, opts.Doer.ID))). - And(builder.Eq{"team_user.org_id": opts.OrgID}) - - sess.In("org_user.uid", teamMates) - } - return nil -} - // 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() { sess.And("is_public = ?", true) } - if err := opts.addTeamMatesOnlyFilter(ctx, sess); err != nil { - return 0, err - } return sess.Count(new(OrgUser)) } @@ -551,9 +535,6 @@ func GetOrgUsersByOrgID(ctx context.Context, opts *FindOrgMembersOpts) ([]*OrgUs if opts.PublicOnly() { sess.And("is_public = ?", true) } - if err := opts.addTeamMatesOnlyFilter(ctx, sess); err != nil { - return nil, err - } if opts.ListOptions.PageSize > 0 { sess = db.SetSessionPagination(sess, opts) From 317176e3ede1ddd7161972d5fe6705f400df1690 Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Thu, 10 Oct 2024 17:44:46 +0200 Subject: [PATCH 04/13] jup --- models/organization/org.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/organization/org.go b/models/organization/org.go index 54896e8d05d6f..cfd718aa6a79f 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -658,7 +658,7 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in return teamIDs, db.GetEngine(ctx). Table("team"). Cols("team.id"). - Where(userTeamIDbuilder(org.ID, userID)). + Where(builder.In("team.id", userTeamIDbuilder(org.ID, userID))). Find(&teamIDs) } From 4f38f65a29949936eaa3e4b24662666c72c658a9 Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Fri, 11 Oct 2024 17:57:19 +0200 Subject: [PATCH 05/13] no builder for now --- models/organization/org.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index cfd718aa6a79f..19b6f51e9b969 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -658,19 +658,12 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in return teamIDs, db.GetEngine(ctx). Table("team"). Cols("team.id"). - Where(builder.In("team.id", userTeamIDbuilder(org.ID, userID))). + Where("`team_user`.org_id = ?", org.ID). + Join("INNER", "team_user", "`team_user`.team_id = team.id"). + And("`team_user`.uid = ?", userID). Find(&teamIDs) } -func userTeamIDbuilder(orgID, userID int64) *builder.Builder { - return builder.Select("team.id").From("team"). - InnerJoin("team_user", "team_user.team_id = team.id"). - Where(builder.Eq{ - "team_user.org_id": orgID, - "team_user.uid": userID, - }) -} - // TeamsWithAccessToRepo returns all teams that have given access level to the repository. func (org *Organization) TeamsWithAccessToRepo(ctx context.Context, repoID int64, mode perm.AccessMode) ([]*Team, error) { return GetTeamsWithAccessToRepo(ctx, org.ID, repoID, mode) From e79ef77fdd5c6898746fa04c31c51737cfe4d1c9 Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Fri, 11 Oct 2024 18:15:00 +0200 Subject: [PATCH 06/13] Revert "no builder for now" This reverts commit 4f38f65a29949936eaa3e4b24662666c72c658a9. --- models/organization/org.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index 19b6f51e9b969..cfd718aa6a79f 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -658,12 +658,19 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in return teamIDs, db.GetEngine(ctx). Table("team"). Cols("team.id"). - Where("`team_user`.org_id = ?", org.ID). - Join("INNER", "team_user", "`team_user`.team_id = team.id"). - And("`team_user`.uid = ?", userID). + Where(builder.In("team.id", userTeamIDbuilder(org.ID, userID))). Find(&teamIDs) } +func userTeamIDbuilder(orgID, userID int64) *builder.Builder { + return builder.Select("team.id").From("team"). + InnerJoin("team_user", "team_user.team_id = team.id"). + Where(builder.Eq{ + "team_user.org_id": orgID, + "team_user.uid": userID, + }) +} + // TeamsWithAccessToRepo returns all teams that have given access level to the repository. func (org *Organization) TeamsWithAccessToRepo(ctx context.Context, repoID int64, mode perm.AccessMode) ([]*Team, error) { return GetTeamsWithAccessToRepo(ctx, org.ID, repoID, mode) From 23f8b3b7042db6daac4ec4ee258e42f9aef4f256 Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Fri, 11 Oct 2024 18:18:03 +0200 Subject: [PATCH 07/13] fix --- models/organization/org_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/models/organization/org_test.go b/models/organization/org_test.go index 33821fb1ceb7f..80dfc623ec3cf 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -211,6 +211,7 @@ func TestGetOrgUsersByOrgID(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ + Doer: &user_model.User{IsActive: true}, ListOptions: db.ListOptions{}, OrgID: 3, }) @@ -234,6 +235,13 @@ func TestGetOrgUsersByOrgID(t *testing.T) { UID: 28, IsPublic: true, }, *orgUsers[2]) + + orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ + ListOptions: db.ListOptions{}, + OrgID: 3, + }) + assert.NoError(t, err) + assert.Len(t, orgUsers, 2) } orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ From 695db86f40d9d92741a68b43ed14e75032125076 Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Fri, 11 Oct 2024 19:31:10 +0200 Subject: [PATCH 08/13] fix test ... --- models/organization/org.go | 2 +- models/organization/org_test.go | 62 ++++++++++++++++----------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index cfd718aa6a79f..8e3c3b6589f3e 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -202,7 +202,7 @@ type FindOrgMembersOpts struct { } func (opts FindOrgMembersOpts) PublicOnly() bool { - return opts.Doer == nil || !opts.IsMember && !opts.Doer.IsAdmin + return opts.Doer == nil || !(opts.IsMember || opts.Doer.IsAdmin) } // CountOrgMembers counts the organization's members diff --git a/models/organization/org_test.go b/models/organization/org_test.go index 80dfc623ec3cf..5442c37ccc94c 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -4,6 +4,7 @@ package organization_test import ( + "sort" "testing" "code.gitea.io/gitea/models/db" @@ -210,39 +211,38 @@ func TestFindOrgs(t *testing.T) { func TestGetOrgUsersByOrgID(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) - orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ - Doer: &user_model.User{IsActive: true}, - ListOptions: db.ListOptions{}, - OrgID: 3, + 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]) - - orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ - ListOptions: db.ListOptions{}, - OrgID: 3, - }) - assert.NoError(t, err) - assert.Len(t, orgUsers, 2) - } + assert.Len(t, orgUsers, 2) orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ ListOptions: db.ListOptions{}, From 3af5ae7ade0b78313e8dbee1130be0b266f6ac8c Mon Sep 17 00:00:00 2001 From: "m.huber" Date: Mon, 14 Oct 2024 17:53:33 +0200 Subject: [PATCH 09/13] try with less eslect --- models/organization/org.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index 8e3c3b6589f3e..96b4f1eb3fb75 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -656,9 +656,7 @@ func (org *Organization) getUserTeams(ctx context.Context, userID int64, cols .. func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) { teamIDs := make([]int64, 0, org.NumTeams) return teamIDs, db.GetEngine(ctx). - Table("team"). - Cols("team.id"). - Where(builder.In("team.id", userTeamIDbuilder(org.ID, userID))). + Where(userTeamIDbuilder(org.ID, userID)). Find(&teamIDs) } From 6a2638240dabbc60b12cce44a678bf5f690b133e Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 14 Oct 2024 18:03:48 +0200 Subject: [PATCH 10/13] rename func to getUserTeamIDsQueryBuilder --- models/organization/org.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index 96b4f1eb3fb75..a8fb94618e5fb 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -656,11 +656,11 @@ func (org *Organization) getUserTeams(ctx context.Context, userID int64, cols .. func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) { teamIDs := make([]int64, 0, org.NumTeams) return teamIDs, db.GetEngine(ctx). - Where(userTeamIDbuilder(org.ID, userID)). + Where(getUserTeamIDsQueryBuilder(org.ID, userID)). Find(&teamIDs) } -func userTeamIDbuilder(orgID, userID int64) *builder.Builder { +func getUserTeamIDsQueryBuilder(orgID, userID int64) *builder.Builder { return builder.Select("team.id").From("team"). InnerJoin("team_user", "team_user.team_id = team.id"). Where(builder.Eq{ From efcb63db0033a10007f0351b60a07f4bbf28782a Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 14 Oct 2024 18:16:10 +0200 Subject: [PATCH 11/13] Revert "try with less eslect" This reverts commit 3af5ae7ade0b78313e8dbee1130be0b266f6ac8c. because of error: "Unsupported condition type" --- models/organization/org.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/organization/org.go b/models/organization/org.go index a8fb94618e5fb..fdb1b93d65a8f 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -656,7 +656,9 @@ func (org *Organization) getUserTeams(ctx context.Context, userID int64, cols .. func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]int64, error) { teamIDs := make([]int64, 0, org.NumTeams) return teamIDs, db.GetEngine(ctx). - Where(getUserTeamIDsQueryBuilder(org.ID, userID)). + Table("team"). + Cols("team.id"). + Where(builder.In("team.id", getUserTeamIDsQueryBuilder(org.ID, userID))). Find(&teamIDs) } From 7bb645eaa959b43a878afdbb3057df47a29cfac4 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 23 Oct 2024 01:17:13 +0200 Subject: [PATCH 12/13] not needed here and dublicated on related pull --- models/organization/org.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index fdb1b93d65a8f..c2490145bf1b0 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -658,19 +658,12 @@ func (org *Organization) getUserTeamIDs(ctx context.Context, userID int64) ([]in return teamIDs, db.GetEngine(ctx). Table("team"). Cols("team.id"). - Where(builder.In("team.id", getUserTeamIDsQueryBuilder(org.ID, userID))). + Where("`team_user`.org_id = ?", org.ID). + Join("INNER", "team_user", "`team_user`.team_id = team.id"). + And("`team_user`.uid = ?", userID). Find(&teamIDs) } -func getUserTeamIDsQueryBuilder(orgID, userID int64) *builder.Builder { - return builder.Select("team.id").From("team"). - InnerJoin("team_user", "team_user.team_id = team.id"). - Where(builder.Eq{ - "team_user.org_id": orgID, - "team_user.uid": userID, - }) -} - // TeamsWithAccessToRepo returns all teams that have given access level to the repository. func (org *Organization) TeamsWithAccessToRepo(ctx context.Context, repoID int64, mode perm.AccessMode) ([]*Team, error) { return GetTeamsWithAccessToRepo(ctx, org.ID, repoID, mode) From c5dc0ad29632c4c41b71cadba4581b0ddfe4601d Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sun, 27 Oct 2024 02:36:21 +0100 Subject: [PATCH 13/13] rename --- models/organization/org.go | 8 ++++---- routers/api/v1/org/member.go | 8 ++++---- routers/web/org/home.go | 8 ++++---- routers/web/org/members.go | 2 +- services/context/org.go | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/models/organization/org.go b/models/organization/org.go index c2490145bf1b0..28a46ec8f50da 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -196,13 +196,13 @@ func (org *Organization) CanCreateRepo() bool { // FindOrgMembersOpts represensts find org members conditions type FindOrgMembersOpts struct { db.ListOptions - Doer *user_model.User - IsMember bool - OrgID int64 + Doer *user_model.User + IsDoerMember bool + OrgID int64 } func (opts FindOrgMembersOpts) PublicOnly() bool { - return opts.Doer == nil || !(opts.IsMember || opts.Doer.IsAdmin) + return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin) } // CountOrgMembers counts the organization's members diff --git a/routers/api/v1/org/member.go b/routers/api/v1/org/member.go index 021526fc6f0fd..edcee1e207719 100644 --- a/routers/api/v1/org/member.go +++ b/routers/api/v1/org/member.go @@ -20,10 +20,10 @@ import ( // listMembers list an organization's members func listMembers(ctx *context.APIContext, isMember bool) { opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - IsMember: isMember, - OrgID: ctx.Org.Organization.ID, - ListOptions: utils.GetListOptions(ctx), + Doer: ctx.Doer, + IsDoerMember: isMember, + OrgID: ctx.Org.Organization.ID, + ListOptions: utils.GetListOptions(ctx), } count, err := organization.CountOrgMembers(ctx, opts) diff --git a/routers/web/org/home.go b/routers/web/org/home.go index 986088faebebb..544f5362b897d 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -95,10 +95,10 @@ func home(ctx *context.Context, viewRepositories bool) { } opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, - IsMember: ctx.Org.IsMember, - 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) diff --git a/routers/web/org/members.go b/routers/web/org/members.go index 5f39d45325918..97dfff3afe64d 100644 --- a/routers/web/org/members.go +++ b/routers/web/org/members.go @@ -44,7 +44,7 @@ func Members(ctx *context.Context) { ctx.Error(http.StatusInternalServerError, "IsOrgMember") return } - opts.IsMember = isMember + opts.IsDoerMember = isMember } ctx.Data["PublicOnly"] = opts.PublicOnly() diff --git a/services/context/org.go b/services/context/org.go index 4500e595e1121..e4206293724eb 100644 --- a/services/context/org.go +++ b/services/context/org.go @@ -176,9 +176,9 @@ func HandleOrgAssignment(ctx *Context, args ...bool) { // Member opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, - IsMember: ctx.Org.IsMember, + Doer: ctx.Doer, + OrgID: org.ID, + IsDoerMember: ctx.Org.IsMember, } ctx.Data["NumMembers"], err = organization.CountOrgMembers(ctx, opts) if err != nil {