code.gitea.io/gitea@v1.21.7/models/organization/team_list.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package organization
     5  
     6  import (
     7  	"context"
     8  	"strings"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	"code.gitea.io/gitea/models/perm"
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unit"
    14  
    15  	"xorm.io/builder"
    16  )
    17  
    18  type TeamList []*Team
    19  
    20  func (t TeamList) LoadUnits(ctx context.Context) error {
    21  	for _, team := range t {
    22  		if err := team.LoadUnits(ctx); err != nil {
    23  			return err
    24  		}
    25  	}
    26  	return nil
    27  }
    28  
    29  func (t TeamList) UnitMaxAccess(tp unit.Type) perm.AccessMode {
    30  	maxAccess := perm.AccessModeNone
    31  	for _, team := range t {
    32  		if team.IsOwnerTeam() {
    33  			return perm.AccessModeOwner
    34  		}
    35  		for _, teamUnit := range team.Units {
    36  			if teamUnit.Type != tp {
    37  				continue
    38  			}
    39  			if teamUnit.AccessMode > maxAccess {
    40  				maxAccess = teamUnit.AccessMode
    41  			}
    42  		}
    43  	}
    44  	return maxAccess
    45  }
    46  
    47  // SearchTeamOptions holds the search options
    48  type SearchTeamOptions struct {
    49  	db.ListOptions
    50  	UserID      int64
    51  	Keyword     string
    52  	OrgID       int64
    53  	IncludeDesc bool
    54  }
    55  
    56  func (opts *SearchTeamOptions) toCond() builder.Cond {
    57  	cond := builder.NewCond()
    58  
    59  	if len(opts.Keyword) > 0 {
    60  		lowerKeyword := strings.ToLower(opts.Keyword)
    61  		var keywordCond builder.Cond = builder.Like{"lower_name", lowerKeyword}
    62  		if opts.IncludeDesc {
    63  			keywordCond = keywordCond.Or(builder.Like{"LOWER(description)", lowerKeyword})
    64  		}
    65  		cond = cond.And(keywordCond)
    66  	}
    67  
    68  	if opts.OrgID > 0 {
    69  		cond = cond.And(builder.Eq{"`team`.org_id": opts.OrgID})
    70  	}
    71  
    72  	if opts.UserID > 0 {
    73  		cond = cond.And(builder.Eq{"team_user.uid": opts.UserID})
    74  	}
    75  
    76  	return cond
    77  }
    78  
    79  // SearchTeam search for teams. Caller is responsible to check permissions.
    80  func SearchTeam(ctx context.Context, opts *SearchTeamOptions) (TeamList, int64, error) {
    81  	sess := db.GetEngine(ctx)
    82  
    83  	opts.SetDefaultValues()
    84  	cond := opts.toCond()
    85  
    86  	if opts.UserID > 0 {
    87  		sess = sess.Join("INNER", "team_user", "team_user.team_id = team.id")
    88  	}
    89  	sess = db.SetSessionPagination(sess, opts)
    90  
    91  	teams := make([]*Team, 0, opts.PageSize)
    92  	count, err := sess.Where(cond).OrderBy("lower_name").FindAndCount(&teams)
    93  	if err != nil {
    94  		return nil, 0, err
    95  	}
    96  
    97  	return teams, count, nil
    98  }
    99  
   100  // GetRepoTeams gets the list of teams that has access to the repository
   101  func GetRepoTeams(ctx context.Context, repo *repo_model.Repository) (teams TeamList, err error) {
   102  	return teams, db.GetEngine(ctx).
   103  		Join("INNER", "team_repo", "team_repo.team_id = team.id").
   104  		Where("team.org_id = ?", repo.OwnerID).
   105  		And("team_repo.repo_id=?", repo.ID).
   106  		OrderBy("CASE WHEN name LIKE '" + OwnerTeamName + "' THEN '' ELSE name END").
   107  		Find(&teams)
   108  }
   109  
   110  // GetUserOrgTeams returns all teams that user belongs to in given organization.
   111  func GetUserOrgTeams(ctx context.Context, orgID, userID int64) (teams TeamList, err error) {
   112  	return teams, db.GetEngine(ctx).
   113  		Join("INNER", "team_user", "team_user.team_id = team.id").
   114  		Where("team.org_id = ?", orgID).
   115  		And("team_user.uid=?", userID).
   116  		Find(&teams)
   117  }
   118  
   119  // GetUserRepoTeams returns user repo's teams
   120  func GetUserRepoTeams(ctx context.Context, orgID, userID, repoID int64) (teams TeamList, err error) {
   121  	return teams, db.GetEngine(ctx).
   122  		Join("INNER", "team_user", "team_user.team_id = team.id").
   123  		Join("INNER", "team_repo", "team_repo.team_id = team.id").
   124  		Where("team.org_id = ?", orgID).
   125  		And("team_user.uid=?", userID).
   126  		And("team_repo.repo_id=?", repoID).
   127  		Find(&teams)
   128  }