Skip to content

Commit b74810f

Browse files
committed
Optimize IsUserOrgOwner
1 parent 4f44e72 commit b74810f

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

models/org.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ type OrgUser struct {
301301
}
302302

303303
func isOrganizationOwner(e Engine, orgID, uid int64) (bool, error) {
304-
ownerTeam, err := getTeam(e, orgID, ownerTeamName)
304+
ownerTeam, err := getOwnerTeam(e, orgID)
305305
if err != nil {
306306
if err == ErrTeamNotExist {
307307
log.Error("Organization does not have owner team: %d", orgID)

models/org_team.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ func GetTeam(orgID int64, name string) (*Team, error) {
362362
return getTeam(x, orgID, name)
363363
}
364364

365+
// getOwnerTeam returns team by given team name and organization.
366+
func getOwnerTeam(e Engine, orgID int64) (*Team, error) {
367+
return getTeam(e, orgID, ownerTeamName)
368+
}
369+
365370
func getTeamByID(e Engine, teamID int64) (*Team, error) {
366371
t := new(Team)
367372
has, err := e.ID(teamID).Get(t)

models/userlist.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package models
66

77
import (
8+
"code.gitea.io/gitea/modules/log"
89
"fmt"
910
)
1011

@@ -23,13 +24,43 @@ func (users UserList) getUserIDs() []int64 {
2324
// IsUserOrgOwner returns true if user is in the owner team of given organization.
2425
func (users UserList) IsUserOrgOwner(orgID int64) map[int64]bool {
2526
results := make(map[int64]bool, len(users))
26-
//TODO use directly xorm
27-
for _, u := range users {
28-
results[u.ID] = u.IsUserOrgOwner(orgID)
27+
for _, user := range users {
28+
results[user.ID] = false //Set default to false
29+
}
30+
ownerMaps, err := users.loadOrganizationOwners(x, orgID)
31+
if err == nil {
32+
for _, owner := range ownerMaps {
33+
results[owner.UID] = true
34+
}
2935
}
3036
return results
3137
}
3238

39+
func (users UserList) loadOrganizationOwners(e Engine, orgID int64) (map[int64]*TeamUser, error) {
40+
if len(users) == 0 {
41+
return nil, nil
42+
}
43+
ownerTeam, err := getOwnerTeam(e, orgID)
44+
if err != nil {
45+
if err == ErrTeamNotExist {
46+
log.Error("Organization does not have owner team: %d", orgID)
47+
return nil, nil
48+
}
49+
return nil, err
50+
}
51+
52+
userIDs := users.getUserIDs()
53+
ownerMaps := make(map[int64]*TeamUser)
54+
err = e.In("uid", userIDs).
55+
And("org_id=?", orgID).
56+
And("team_id=?", ownerTeam.ID).
57+
Find(&ownerMaps)
58+
if err != nil {
59+
return nil, fmt.Errorf("find team users: %v", err)
60+
}
61+
return ownerMaps, nil
62+
}
63+
3364
// GetTwoFaStatus return state of 2FA enrollement
3465
func (users UserList) GetTwoFaStatus() map[int64]bool {
3566
results := make(map[int64]bool, len(users))

models/userlist_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func TestUserListIsUserOrgOwner(t *testing.T) {
5252
})
5353
}
5454
}
55+
5556
func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) {
5657
org, err := GetUserByID(orgID)
5758
assert.NoError(t, err)

0 commit comments

Comments
 (0)