From b74810f6ee19fdf356fb0eba13d7af74c44badbb Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sun, 28 Jul 2019 02:09:18 +0200 Subject: [PATCH] Optimize IsUserOrgOwner --- models/org.go | 2 +- models/org_team.go | 5 +++++ models/userlist.go | 37 ++++++++++++++++++++++++++++++++++--- models/userlist_test.go | 1 + 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/models/org.go b/models/org.go index a54293f12669a..7032f6698eeb0 100644 --- a/models/org.go +++ b/models/org.go @@ -301,7 +301,7 @@ type OrgUser struct { } func isOrganizationOwner(e Engine, orgID, uid int64) (bool, error) { - ownerTeam, err := getTeam(e, orgID, ownerTeamName) + ownerTeam, err := getOwnerTeam(e, orgID) if err != nil { if err == ErrTeamNotExist { log.Error("Organization does not have owner team: %d", orgID) diff --git a/models/org_team.go b/models/org_team.go index dcf07437403d3..1786376d02c81 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -362,6 +362,11 @@ func GetTeam(orgID int64, name string) (*Team, error) { return getTeam(x, orgID, name) } +// getOwnerTeam returns team by given team name and organization. +func getOwnerTeam(e Engine, orgID int64) (*Team, error) { + return getTeam(e, orgID, ownerTeamName) +} + func getTeamByID(e Engine, teamID int64) (*Team, error) { t := new(Team) has, err := e.ID(teamID).Get(t) diff --git a/models/userlist.go b/models/userlist.go index e03db111288d9..2e3a0679d707f 100644 --- a/models/userlist.go +++ b/models/userlist.go @@ -5,6 +5,7 @@ package models import ( + "code.gitea.io/gitea/modules/log" "fmt" ) @@ -23,13 +24,43 @@ func (users UserList) getUserIDs() []int64 { // IsUserOrgOwner returns true if user is in the owner team of given organization. func (users UserList) IsUserOrgOwner(orgID int64) map[int64]bool { results := make(map[int64]bool, len(users)) - //TODO use directly xorm - for _, u := range users { - results[u.ID] = u.IsUserOrgOwner(orgID) + for _, user := range users { + results[user.ID] = false //Set default to false + } + ownerMaps, err := users.loadOrganizationOwners(x, orgID) + if err == nil { + for _, owner := range ownerMaps { + results[owner.UID] = true + } } return results } +func (users UserList) loadOrganizationOwners(e Engine, orgID int64) (map[int64]*TeamUser, error) { + if len(users) == 0 { + return nil, nil + } + ownerTeam, err := getOwnerTeam(e, orgID) + if err != nil { + if err == ErrTeamNotExist { + log.Error("Organization does not have owner team: %d", orgID) + return nil, nil + } + return nil, err + } + + userIDs := users.getUserIDs() + ownerMaps := make(map[int64]*TeamUser) + err = e.In("uid", userIDs). + And("org_id=?", orgID). + And("team_id=?", ownerTeam.ID). + Find(&ownerMaps) + if err != nil { + return nil, fmt.Errorf("find team users: %v", err) + } + return ownerMaps, nil +} + // GetTwoFaStatus return state of 2FA enrollement func (users UserList) GetTwoFaStatus() map[int64]bool { results := make(map[int64]bool, len(users)) diff --git a/models/userlist_test.go b/models/userlist_test.go index d3d26d45dc898..223d19d71a6e9 100644 --- a/models/userlist_test.go +++ b/models/userlist_test.go @@ -52,6 +52,7 @@ func TestUserListIsUserOrgOwner(t *testing.T) { }) } } + func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) { org, err := GetUserByID(orgID) assert.NoError(t, err)