summaryrefslogtreecommitdiffstats
path: root/models/userlist.go
diff options
context:
space:
mode:
authorAntoine GIRARD <sapk@users.noreply.github.com>2019-08-02 18:06:28 +0200
committertechknowlogick <techknowlogick@gitea.io>2019-08-02 12:06:27 -0400
commit76408d50fb338e9239ee06bb26eec28453167300 (patch)
tree552f49cb095e9744c11f71dba9a3910a7d0ceb18 /models/userlist.go
parent3566d2c860b0ad3ab7d6d5fb1490eb9a5b5f5974 (diff)
downloadgitea-76408d50fb338e9239ee06bb26eec28453167300.tar.gz
gitea-76408d50fb338e9239ee06bb26eec28453167300.zip
org/members: display 2FA members states + optimize sql requests (#7621)
* org/members: display 2FA state * fix comment typo * lay down UserList bases * add basic test for previous methods * add comment for UserList type * add valid two-fa account * test new UserList methods * optimize MembersIsPublic by side loading info on GetMembers + fix integrations tests * respect fmt rules * use map for data * Optimize GetTwoFaStatus * rewrite by using existing sub func * Optimize IsUserOrgOwner * remove un-used code * tests: cover empty org + fix import order * tests: add ErrTeamNotExist path * tests: fix wrong expected result
Diffstat (limited to 'models/userlist.go')
-rw-r--r--models/userlist.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/models/userlist.go b/models/userlist.go
new file mode 100644
index 0000000000..43838a6804
--- /dev/null
+++ b/models/userlist.go
@@ -0,0 +1,95 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+ "fmt"
+
+ "code.gitea.io/gitea/modules/log"
+)
+
+//UserList is a list of user.
+// This type provide valuable methods to retrieve information for a group of users efficiently.
+type UserList []*User
+
+func (users UserList) getUserIDs() []int64 {
+ userIDs := make([]int64, len(users))
+ for _, user := range users {
+ userIDs = append(userIDs, user.ID) //Considering that user id are unique in the list
+ }
+ return userIDs
+}
+
+// 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))
+ 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))
+ for _, user := range users {
+ results[user.ID] = false //Set default to false
+ }
+ tokenMaps, err := users.loadTwoFactorStatus(x)
+ if err == nil {
+ for _, token := range tokenMaps {
+ results[token.UID] = true
+ }
+ }
+
+ return results
+}
+
+func (users UserList) loadTwoFactorStatus(e Engine) (map[int64]*TwoFactor, error) {
+ if len(users) == 0 {
+ return nil, nil
+ }
+
+ userIDs := users.getUserIDs()
+ tokenMaps := make(map[int64]*TwoFactor, len(userIDs))
+ err := e.
+ In("uid", userIDs).
+ Find(&tokenMaps)
+ if err != nil {
+ return nil, fmt.Errorf("find two factor: %v", err)
+ }
+ return tokenMaps, nil
+}