code.gitea.io/gitea@v1.22.3/models/organization/team_user.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  
     9  	"code.gitea.io/gitea/models/db"
    10  	user_model "code.gitea.io/gitea/models/user"
    11  
    12  	"xorm.io/builder"
    13  )
    14  
    15  // TeamUser represents an team-user relation.
    16  type TeamUser struct {
    17  	ID     int64 `xorm:"pk autoincr"`
    18  	OrgID  int64 `xorm:"INDEX"`
    19  	TeamID int64 `xorm:"UNIQUE(s)"`
    20  	UID    int64 `xorm:"UNIQUE(s)"`
    21  }
    22  
    23  // IsTeamMember returns true if given user is a member of team.
    24  func IsTeamMember(ctx context.Context, orgID, teamID, userID int64) (bool, error) {
    25  	return db.GetEngine(ctx).
    26  		Where("org_id=?", orgID).
    27  		And("team_id=?", teamID).
    28  		And("uid=?", userID).
    29  		Table("team_user").
    30  		Exist()
    31  }
    32  
    33  // SearchMembersOptions holds the search options
    34  type SearchMembersOptions struct {
    35  	db.ListOptions
    36  	TeamID int64
    37  }
    38  
    39  func (opts SearchMembersOptions) ToConds() builder.Cond {
    40  	cond := builder.NewCond()
    41  	if opts.TeamID > 0 {
    42  		cond = cond.And(builder.Eq{"": opts.TeamID})
    43  	}
    44  	return cond
    45  }
    46  
    47  // GetTeamMembers returns all members in given team of organization.
    48  func GetTeamMembers(ctx context.Context, opts *SearchMembersOptions) ([]*user_model.User, error) {
    49  	var members []*user_model.User
    50  	sess := db.GetEngine(ctx)
    51  	if opts.TeamID > 0 {
    52  		sess = sess.In("id",
    53  			builder.Select("uid").
    54  				From("team_user").
    55  				Where(builder.Eq{"team_id": opts.TeamID}),
    56  		)
    57  	}
    58  	if opts.PageSize > 0 && opts.Page > 0 {
    59  		sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
    60  	}
    61  	if err := sess.OrderBy("full_name, name").Find(&members); err != nil {
    62  		return nil, err
    63  	}
    64  	return members, nil
    65  }
    66  
    67  // IsUserInTeams returns if a user in some teams
    68  func IsUserInTeams(ctx context.Context, userID int64, teamIDs []int64) (bool, error) {
    69  	return db.GetEngine(ctx).Where("uid=?", userID).In("team_id", teamIDs).Exist(new(TeamUser))
    70  }
    71  
    72  // UsersInTeamsCount counts the number of users which are in userIDs and teamIDs
    73  func UsersInTeamsCount(ctx context.Context, userIDs, teamIDs []int64) (int64, error) {
    74  	var ids []int64
    75  	if err := db.GetEngine(ctx).In("uid", userIDs).In("team_id", teamIDs).
    76  		Table("team_user").
    77  		Cols("uid").GroupBy("uid").Find(&ids); err != nil {
    78  		return 0, err
    79  	}
    80  	return int64(len(ids)), nil
    81  }