2022-03-29 14:29:02 +08:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2022-03-29 14:29:02 +08:00
package organization
import (
"context"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/perm"
2024-11-22 07:44:48 -08:00
"code.gitea.io/gitea/models/unit"
2025-06-24 21:24:09 +08:00
"xorm.io/builder"
2022-03-29 14:29:02 +08:00
)
// TeamRepo represents an team-repository relation.
type TeamRepo struct {
ID int64 ` xorm:"pk autoincr" `
OrgID int64 ` xorm:"INDEX" `
TeamID int64 ` xorm:"UNIQUE(s)" `
RepoID int64 ` xorm:"UNIQUE(s)" `
}
// HasTeamRepo returns true if given repository belongs to team.
func HasTeamRepo ( ctx context . Context , orgID , teamID , repoID int64 ) bool {
has , _ := db . GetEngine ( ctx ) .
Where ( "org_id=?" , orgID ) .
And ( "team_id=?" , teamID ) .
And ( "repo_id=?" , repoID ) .
Get ( new ( TeamRepo ) )
return has
}
2022-07-12 17:32:37 -04:00
// AddTeamRepo adds a repo for an organization's team
2022-03-29 14:29:02 +08:00
func AddTeamRepo ( ctx context . Context , orgID , teamID , repoID int64 ) error {
_ , err := db . GetEngine ( ctx ) . Insert ( & TeamRepo {
OrgID : orgID ,
TeamID : teamID ,
RepoID : repoID ,
} )
return err
}
// RemoveTeamRepo remove repository from team
func RemoveTeamRepo ( ctx context . Context , teamID , repoID int64 ) error {
_ , err := db . DeleteByBean ( ctx , & TeamRepo {
TeamID : teamID ,
RepoID : repoID ,
} )
return err
}
2025-06-24 21:24:09 +08:00
// GetTeamsWithAccessToAnyRepoUnit returns all teams in an organization that have given access level to the repository special unit.
// This function is only used for finding some teams that can be used as branch protection allowlist or reviewers, it isn't really used for access control.
// FIXME: TEAM-UNIT-PERMISSION this logic is not complete, search the fixme keyword to see more details
2025-11-09 11:13:31 +08:00
func GetTeamsWithAccessToAnyRepoUnit ( ctx context . Context , orgID , repoID int64 , mode perm . AccessMode , unitType unit . Type , unitTypesMore ... unit . Type ) ( teams [ ] * Team , err error ) {
teamIDs , err := getTeamIDsWithAccessToAnyRepoUnit ( ctx , orgID , repoID , mode , unitType , unitTypesMore ... )
if err != nil {
return nil , err
}
if len ( teamIDs ) == 0 {
return teams , nil
}
err = db . GetEngine ( ctx ) . Where ( builder . In ( "id" , teamIDs ) ) . OrderBy ( "team.name" ) . Find ( & teams )
return teams , err
}
2024-11-22 07:44:48 -08:00
2025-11-09 11:13:31 +08:00
func getTeamIDsWithAccessToAnyRepoUnit ( ctx context . Context , orgID , repoID int64 , mode perm . AccessMode , unitType unit . Type , unitTypesMore ... unit . Type ) ( teamIDs [ ] int64 , err error ) {
2025-06-24 21:24:09 +08:00
sub := builder . Select ( "team_id" ) . From ( "team_unit" ) .
Where ( builder . Expr ( "team_unit.team_id = team.id" ) ) .
And ( builder . In ( "team_unit.type" , append ( [ ] unit . Type { unitType } , unitTypesMore ... ) ) ) .
And ( builder . Expr ( "team_unit.access_mode >= ?" , mode ) )
2025-11-09 11:13:31 +08:00
err = db . GetEngine ( ctx ) .
Select ( "team.id" ) .
Table ( "team" ) .
2024-11-22 07:44:48 -08:00
Join ( "INNER" , "team_repo" , "team_repo.team_id = team.id" ) .
2025-11-09 11:13:31 +08:00
And ( "team_repo.org_id = ? AND team_repo.repo_id = ?" , orgID , repoID ) .
2025-06-24 21:24:09 +08:00
And ( builder . Or (
builder . Expr ( "team.authorize >= ?" , mode ) ,
builder . In ( "team.id" , sub ) ,
) ) .
2025-11-09 11:13:31 +08:00
Find ( & teamIDs )
return teamIDs , err
}
2025-06-24 21:24:09 +08:00
2025-11-09 11:13:31 +08:00
func GetTeamUserIDsWithAccessToAnyRepoUnit ( ctx context . Context , orgID , repoID int64 , mode perm . AccessMode , unitType unit . Type , unitTypesMore ... unit . Type ) ( userIDs [ ] int64 , err error ) {
teamIDs , err := getTeamIDsWithAccessToAnyRepoUnit ( ctx , orgID , repoID , mode , unitType , unitTypesMore ... )
if err != nil {
return nil , err
}
if len ( teamIDs ) == 0 {
return userIDs , nil
}
err = db . GetEngine ( ctx ) . Table ( "team_user" ) . Select ( "uid" ) . Where ( builder . In ( "team_id" , teamIDs ) ) . Find ( & userIDs )
return userIDs , err
2024-11-22 07:44:48 -08:00
}