2022-03-29 09:29:02 +03:00
// Copyright 2022 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 organization
import (
"context"
"code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
2022-03-29 22:13:41 +03:00
2022-03-29 09:29:02 +03:00
"xorm.io/builder"
)
// TeamUser represents an team-user relation.
type TeamUser struct {
ID int64 ` xorm:"pk autoincr" `
OrgID int64 ` xorm:"INDEX" `
TeamID int64 ` xorm:"UNIQUE(s)" `
UID int64 ` xorm:"UNIQUE(s)" `
}
// IsTeamMember returns true if given user is a member of team.
func IsTeamMember ( ctx context . Context , orgID , teamID , userID int64 ) ( bool , error ) {
return db . GetEngine ( ctx ) .
Where ( "org_id=?" , orgID ) .
And ( "team_id=?" , teamID ) .
And ( "uid=?" , userID ) .
Table ( "team_user" ) .
Exist ( )
}
// GetTeamUsersByTeamID returns team users for a team
func GetTeamUsersByTeamID ( ctx context . Context , teamID int64 ) ( [ ] * TeamUser , error ) {
teamUsers := make ( [ ] * TeamUser , 0 , 10 )
return teamUsers , db . GetEngine ( ctx ) .
Where ( "team_id=?" , teamID ) .
Find ( & teamUsers )
}
// SearchMembersOptions holds the search options
type SearchMembersOptions struct {
db . ListOptions
TeamID int64
}
func ( opts SearchMembersOptions ) ToConds ( ) builder . Cond {
cond := builder . NewCond ( )
if opts . TeamID > 0 {
cond = cond . And ( builder . Eq { "" : opts . TeamID } )
}
return cond
}
// GetTeamMembers returns all members in given team of organization.
func GetTeamMembers ( ctx context . Context , opts * SearchMembersOptions ) ( [ ] * user_model . User , error ) {
var members [ ] * user_model . User
sess := db . GetEngine ( ctx )
if opts . TeamID > 0 {
sess = sess . In ( "id" ,
builder . Select ( "uid" ) .
From ( "team_user" ) .
Where ( builder . Eq { "team_id" : opts . TeamID } ) ,
)
}
if opts . PageSize > 0 && opts . Page > - 1 {
sess = sess . Limit ( opts . PageSize , opts . Page * opts . PageSize )
}
if err := sess . OrderBy ( "full_name, name" ) . Find ( & members ) ; err != nil {
return nil , err
}
return members , nil
}
// GetUserOrgTeams returns all teams that user belongs to in given organization.
func GetUserOrgTeams ( ctx context . Context , orgID , userID int64 ) ( teams [ ] * Team , err error ) {
return teams , db . GetEngine ( ctx ) .
Join ( "INNER" , "team_user" , "team_user.team_id = team.id" ) .
Where ( "team.org_id = ?" , orgID ) .
And ( "team_user.uid=?" , userID ) .
Find ( & teams )
}
// GetUserRepoTeams returns user repo's teams
func GetUserRepoTeams ( ctx context . Context , orgID , userID , repoID int64 ) ( teams [ ] * Team , err error ) {
return teams , db . GetEngine ( ctx ) .
Join ( "INNER" , "team_user" , "team_user.team_id = team.id" ) .
Join ( "INNER" , "team_repo" , "team_repo.team_id = team.id" ) .
Where ( "team.org_id = ?" , orgID ) .
And ( "team_user.uid=?" , userID ) .
And ( "team_repo.repo_id=?" , repoID ) .
Find ( & teams )
}
// IsUserInTeams returns if a user in some teams
func IsUserInTeams ( ctx context . Context , userID int64 , teamIDs [ ] int64 ) ( bool , error ) {
return db . GetEngine ( ctx ) . Where ( "uid=?" , userID ) . In ( "team_id" , teamIDs ) . Exist ( new ( TeamUser ) )
}
// UsersInTeamsCount counts the number of users which are in userIDs and teamIDs
func UsersInTeamsCount ( userIDs , teamIDs [ ] int64 ) ( int64 , error ) {
var ids [ ] int64
if err := db . GetEngine ( db . DefaultContext ) . In ( "uid" , userIDs ) . In ( "team_id" , teamIDs ) .
Table ( "team_user" ) .
Cols ( "uid" ) . GroupBy ( "uid" ) . Find ( & ids ) ; err != nil {
return 0 , err
}
return int64 ( len ( ids ) ) , nil
}