aboutsummaryrefslogtreecommitdiffstats
path: root/models/org_team.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/org_team.go')
-rw-r--r--models/org_team.go712
1 files changed, 71 insertions, 641 deletions
diff --git a/models/org_team.go b/models/org_team.go
index faee23f4f8..cf810cad33 100644
--- a/models/org_team.go
+++ b/models/org_team.go
@@ -9,288 +9,24 @@ import (
"context"
"errors"
"fmt"
- "sort"
"strings"
"code.gitea.io/gitea/models/db"
- "code.gitea.io/gitea/models/perm"
+ "code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
- "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
- "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
)
-const ownerTeamName = "Owners"
-
-// Team represents a organization team.
-type Team struct {
- ID int64 `xorm:"pk autoincr"`
- OrgID int64 `xorm:"INDEX"`
- LowerName string
- Name string
- Description string
- AccessMode perm.AccessMode `xorm:"'authorize'"`
- Repos []*repo_model.Repository `xorm:"-"`
- Members []*user_model.User `xorm:"-"`
- NumRepos int
- NumMembers int
- Units []*TeamUnit `xorm:"-"`
- IncludesAllRepositories bool `xorm:"NOT NULL DEFAULT false"`
- CanCreateOrgRepo bool `xorm:"NOT NULL DEFAULT false"`
-}
-
-func init() {
- db.RegisterModel(new(Team))
- db.RegisterModel(new(TeamUser))
- db.RegisterModel(new(TeamRepo))
- db.RegisterModel(new(TeamUnit))
-}
-
-// SearchOrgTeamOptions holds the search options
-type SearchOrgTeamOptions struct {
- db.ListOptions
- Keyword string
- OrgID int64
- IncludeDesc bool
-}
-
-// GetUserTeamOptions holds the search options.
-type GetUserTeamOptions struct {
- db.ListOptions
- UserID int64
-}
-
-// SearchMembersOptions holds the search options
-type SearchMembersOptions struct {
- db.ListOptions
-}
-
-// GetUserTeams search for org teams. Caller is responsible to check permissions.
-func GetUserTeams(opts *GetUserTeamOptions) ([]*Team, int64, error) {
- if opts.Page <= 0 {
- opts.Page = 1
- }
- if opts.PageSize == 0 {
- // Default limit
- opts.PageSize = 10
- }
-
- sess := db.GetEngine(db.DefaultContext)
-
- sess = sess.Join("INNER", "team_user", "team_user.team_id = team.id").
- And("team_user.uid=?", opts.UserID)
-
- count, err := sess.
- Count(new(Team))
- if err != nil {
- return nil, 0, err
- }
-
- if opts.PageSize == -1 {
- opts.PageSize = int(count)
- } else {
- sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
- }
-
- sess = sess.Join("INNER", "team_user", "team_user.team_id = team.id").
- And("team_user.uid=?", opts.UserID)
-
- teams := make([]*Team, 0, opts.PageSize)
- if err = sess.
- OrderBy("lower_name").
- Find(&teams); err != nil {
- return nil, 0, err
- }
-
- return teams, count, nil
-}
-
-// SearchOrgTeams search for org teams. Caller is responsible to check permissions.
-func SearchOrgTeams(opts *SearchOrgTeamOptions) ([]*Team, int64, error) {
- if opts.Page <= 0 {
- opts.Page = 1
- }
- if opts.PageSize == 0 {
- // Default limit
- opts.PageSize = 10
- }
-
- cond := builder.NewCond()
-
- if len(opts.Keyword) > 0 {
- lowerKeyword := strings.ToLower(opts.Keyword)
- var keywordCond builder.Cond = builder.Like{"lower_name", lowerKeyword}
- if opts.IncludeDesc {
- keywordCond = keywordCond.Or(builder.Like{"LOWER(description)", lowerKeyword})
- }
- cond = cond.And(keywordCond)
- }
-
- cond = cond.And(builder.Eq{"org_id": opts.OrgID})
-
- sess := db.GetEngine(db.DefaultContext)
-
- count, err := sess.
- Where(cond).
- Count(new(Team))
- if err != nil {
- return nil, 0, err
- }
-
- sess = sess.Where(cond)
- if opts.PageSize == -1 {
- opts.PageSize = int(count)
- } else {
- sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
- }
-
- teams := make([]*Team, 0, opts.PageSize)
- if err = sess.
- OrderBy("lower_name").
- Find(&teams); err != nil {
- return nil, 0, err
- }
-
- return teams, count, nil
-}
-
-// ColorFormat provides a basic color format for a Team
-func (t *Team) ColorFormat(s fmt.State) {
- if t == nil {
- log.ColorFprintf(s, "%d:%s (OrgID: %d) %-v",
- log.NewColoredIDValue(0),
- "<nil>",
- log.NewColoredIDValue(0),
- 0)
- return
- }
- log.ColorFprintf(s, "%d:%s (OrgID: %d) %-v",
- log.NewColoredIDValue(t.ID),
- t.Name,
- log.NewColoredIDValue(t.OrgID),
- t.AccessMode)
-}
-
-// GetUnits return a list of available units for a team
-func (t *Team) GetUnits() error {
- return t.getUnits(db.GetEngine(db.DefaultContext))
-}
-
-func (t *Team) getUnits(e db.Engine) (err error) {
- if t.Units != nil {
- return nil
- }
-
- t.Units, err = getUnitsByTeamID(e, t.ID)
- return err
-}
-
-// GetUnitNames returns the team units names
-func (t *Team) GetUnitNames() (res []string) {
- if t.AccessMode >= perm.AccessModeAdmin {
- return unit.AllUnitKeyNames()
- }
-
- for _, u := range t.Units {
- res = append(res, unit.Units[u.Type].NameKey)
- }
- return
-}
-
-// GetUnitsMap returns the team units permissions
-func (t *Team) GetUnitsMap() map[string]string {
- m := make(map[string]string)
- if t.AccessMode >= perm.AccessModeAdmin {
- for _, u := range unit.Units {
- m[u.NameKey] = t.AccessMode.String()
- }
- } else {
- for _, u := range t.Units {
- m[u.Unit().NameKey] = u.AccessMode.String()
- }
- }
- return m
-}
-
-// IsOwnerTeam returns true if team is owner team.
-func (t *Team) IsOwnerTeam() bool {
- return t.Name == ownerTeamName
-}
-
-// IsMember returns true if given user is a member of team.
-func (t *Team) IsMember(userID int64) bool {
- isMember, err := IsTeamMember(t.OrgID, t.ID, userID)
- if err != nil {
- log.Error("IsMember: %v", err)
- return false
- }
- return isMember
-}
-
-func (t *Team) getRepositories(e db.Engine) error {
- if t.Repos != nil {
- return nil
- }
- return e.Join("INNER", "team_repo", "repository.id = team_repo.repo_id").
- Where("team_repo.team_id=?", t.ID).
- OrderBy("repository.name").
- Find(&t.Repos)
-}
-
-// GetRepositories returns paginated repositories in team of organization.
-func (t *Team) GetRepositories(opts *SearchOrgTeamOptions) error {
- if opts.Page == 0 {
- return t.getRepositories(db.GetEngine(db.DefaultContext))
- }
-
- return t.getRepositories(db.GetPaginatedSession(opts))
-}
-
-func (t *Team) getMembers(e db.Engine) (err error) {
- t.Members, err = getTeamMembers(e, t.ID)
- return err
-}
-
-// GetMembers returns paginated members in team of organization.
-func (t *Team) GetMembers(opts *SearchMembersOptions) (err error) {
- if opts.Page == 0 {
- return t.getMembers(db.GetEngine(db.DefaultContext))
- }
-
- return t.getMembers(db.GetPaginatedSession(opts))
-}
-
-// AddMember adds new membership of the team to the organization,
-// the user will have membership to the organization automatically when needed.
-func (t *Team) AddMember(userID int64) error {
- return AddTeamMember(t, userID)
-}
-
-// RemoveMember removes member from team of organization.
-func (t *Team) RemoveMember(userID int64) error {
- return RemoveTeamMember(t, userID)
-}
-
-func (t *Team) hasRepository(e db.Engine, repoID int64) bool {
- return hasTeamRepo(e, t.OrgID, t.ID, repoID)
-}
-
-// HasRepository returns true if given repository belong to team.
-func (t *Team) HasRepository(repoID int64) bool {
- return t.hasRepository(db.GetEngine(db.DefaultContext), repoID)
-}
-
-func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) (err error) {
- e := db.GetEngine(ctx)
- if err = addTeamRepo(e, t.OrgID, t.ID, repo.ID); err != nil {
+func addRepository(ctx context.Context, t *organization.Team, repo *repo_model.Repository) (err error) {
+ if err = organization.AddTeamRepo(ctx, t.OrgID, t.ID, repo.ID); err != nil {
return err
}
- if _, err = e.Incr("num_repos").ID(t.ID).Update(new(Team)); err != nil {
+ if _, err = db.GetEngine(ctx).Incr("num_repos").ID(t.ID).Update(new(organization.Team)); err != nil {
return fmt.Errorf("update team: %v", err)
}
@@ -302,7 +38,7 @@ func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) (
// Make all team members watch this repo if enabled in global settings
if setting.Service.AutoWatchNewRepos {
- if err = t.getMembers(e); err != nil {
+ if err = t.GetMembersCtx(ctx); err != nil {
return fmt.Errorf("getMembers: %v", err)
}
for _, u := range t.Members {
@@ -317,7 +53,7 @@ func (t *Team) addRepository(ctx context.Context, repo *repo_model.Repository) (
// addAllRepositories adds all repositories to the team.
// If the team already has some repositories they will be left unchanged.
-func (t *Team) addAllRepositories(ctx context.Context) error {
+func addAllRepositories(ctx context.Context, t *organization.Team) error {
var orgRepos []repo_model.Repository
e := db.GetEngine(ctx)
if err := e.Where("owner_id = ?", t.OrgID).Find(&orgRepos); err != nil {
@@ -325,8 +61,8 @@ func (t *Team) addAllRepositories(ctx context.Context) error {
}
for _, repo := range orgRepos {
- if !t.hasRepository(e, repo.ID) {
- if err := t.addRepository(ctx, &repo); err != nil {
+ if !hasRepository(ctx, t, repo.ID) {
+ if err := addRepository(ctx, t, &repo); err != nil {
return fmt.Errorf("addRepository: %v", err)
}
}
@@ -336,14 +72,14 @@ func (t *Team) addAllRepositories(ctx context.Context) error {
}
// AddAllRepositories adds all repositories to the team
-func (t *Team) AddAllRepositories() (err error) {
+func AddAllRepositories(t *organization.Team) (err error) {
ctx, committer, err := db.TxContext()
if err != nil {
return err
}
defer committer.Close()
- if err = t.addAllRepositories(ctx); err != nil {
+ if err = addAllRepositories(ctx, t); err != nil {
return err
}
@@ -351,10 +87,10 @@ func (t *Team) AddAllRepositories() (err error) {
}
// AddRepository adds new repository to team of organization.
-func (t *Team) AddRepository(repo *repo_model.Repository) (err error) {
+func AddRepository(t *organization.Team, repo *repo_model.Repository) (err error) {
if repo.OwnerID != t.OrgID {
return errors.New("Repository does not belong to organization")
- } else if t.HasRepository(repo.ID) {
+ } else if HasRepository(t, repo.ID) {
return nil
}
@@ -364,15 +100,20 @@ func (t *Team) AddRepository(repo *repo_model.Repository) (err error) {
}
defer committer.Close()
- if err = t.addRepository(ctx, repo); err != nil {
+ if err = addRepository(ctx, t, repo); err != nil {
return err
}
return committer.Commit()
}
+// HasRepository returns true if given repository belong to team.
+func HasRepository(t *organization.Team, repoID int64) bool {
+ return hasRepository(db.DefaultContext, t, repoID)
+}
+
// RemoveAllRepositories removes all repositories from team and recalculates access
-func (t *Team) RemoveAllRepositories() (err error) {
+func RemoveAllRepositories(t *organization.Team) (err error) {
if t.IncludesAllRepositories {
return nil
}
@@ -383,7 +124,7 @@ func (t *Team) RemoveAllRepositories() (err error) {
}
defer committer.Close()
- if err = t.removeAllRepositories(ctx); err != nil {
+ if err = removeAllRepositories(ctx, t); err != nil {
return err
}
@@ -392,7 +133,7 @@ func (t *Team) RemoveAllRepositories() (err error) {
// removeAllRepositories removes all repositories from team and recalculates access
// Note: Shall not be called if team includes all repositories
-func (t *Team) removeAllRepositories(ctx context.Context) (err error) {
+func removeAllRepositories(ctx context.Context, t *organization.Team) (err error) {
e := db.GetEngine(ctx)
// Delete all accesses.
for _, repo := range t.Repos {
@@ -423,7 +164,7 @@ func (t *Team) removeAllRepositories(ctx context.Context) (err error) {
// Delete team-repo
if _, err := e.
Where("team_id=?", t.ID).
- Delete(new(TeamRepo)); err != nil {
+ Delete(new(organization.TeamRepo)); err != nil {
return err
}
@@ -435,11 +176,15 @@ func (t *Team) removeAllRepositories(ctx context.Context) (err error) {
return nil
}
+func hasRepository(ctx context.Context, t *organization.Team, repoID int64) bool {
+ return organization.HasTeamRepo(ctx, t.OrgID, t.ID, repoID)
+}
+
// removeRepository removes a repository from a team and recalculates access
// Note: Repository shall not be removed from team if it includes all repositories (unless the repository is deleted)
-func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository, recalculate bool) (err error) {
+func removeRepository(ctx context.Context, t *organization.Team, repo *repo_model.Repository, recalculate bool) (err error) {
e := db.GetEngine(ctx)
- if err = removeTeamRepo(e, t.ID, repo.ID); err != nil {
+ if err = organization.RemoveTeamRepo(ctx, t.ID, repo.ID); err != nil {
return err
}
@@ -455,7 +200,7 @@ func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository
}
}
- teamUsers, err := getTeamUsersByTeamID(e, t.ID)
+ teamUsers, err := organization.GetTeamUsersByTeamID(ctx, t.ID)
if err != nil {
return fmt.Errorf("getTeamUsersByTeamID: %v", err)
}
@@ -482,8 +227,8 @@ func (t *Team) removeRepository(ctx context.Context, repo *repo_model.Repository
// RemoveRepository removes repository from team of organization.
// If the team shall include all repositories the request is ignored.
-func (t *Team) RemoveRepository(repoID int64) error {
- if !t.HasRepository(repoID) {
+func RemoveRepository(t *organization.Team, repoID int64) error {
+ if !HasRepository(t, repoID) {
return nil
}
@@ -502,58 +247,21 @@ func (t *Team) RemoveRepository(repoID int64) error {
}
defer committer.Close()
- if err = t.removeRepository(ctx, repo, true); err != nil {
+ if err = removeRepository(ctx, t, repo, true); err != nil {
return err
}
return committer.Commit()
}
-// UnitEnabled returns if the team has the given unit type enabled
-func (t *Team) UnitEnabled(tp unit.Type) bool {
- return t.unitEnabled(db.GetEngine(db.DefaultContext), tp)
-}
-
-func (t *Team) unitEnabled(e db.Engine, tp unit.Type) bool {
- return t.unitAccessMode(e, tp) > perm.AccessModeNone
-}
-
-// UnitAccessMode returns if the team has the given unit type enabled
-func (t *Team) UnitAccessMode(tp unit.Type) perm.AccessMode {
- return t.unitAccessMode(db.GetEngine(db.DefaultContext), tp)
-}
-
-func (t *Team) unitAccessMode(e db.Engine, tp unit.Type) perm.AccessMode {
- if err := t.getUnits(e); err != nil {
- log.Warn("Error loading team (ID: %d) units: %s", t.ID, err.Error())
- }
-
- for _, unit := range t.Units {
- if unit.Type == tp {
- return unit.AccessMode
- }
- }
- return perm.AccessModeNone
-}
-
-// IsUsableTeamName tests if a name could be as team name
-func IsUsableTeamName(name string) error {
- switch name {
- case "new":
- return db.ErrNameReserved{Name: name}
- default:
- return nil
- }
-}
-
// NewTeam creates a record of new team.
// It's caller's responsibility to assign organization ID.
-func NewTeam(t *Team) (err error) {
+func NewTeam(t *organization.Team) (err error) {
if len(t.Name) == 0 {
return errors.New("empty team name")
}
- if err = IsUsableTeamName(t.Name); err != nil {
+ if err = organization.IsUsableTeamName(t.Name); err != nil {
return err
}
@@ -562,19 +270,19 @@ func NewTeam(t *Team) (err error) {
return err
}
if !has {
- return ErrOrgNotExist{t.OrgID, ""}
+ return organization.ErrOrgNotExist{ID: t.OrgID}
}
t.LowerName = strings.ToLower(t.Name)
has, err = db.GetEngine(db.DefaultContext).
Where("org_id=?", t.OrgID).
And("lower_name=?", t.LowerName).
- Get(new(Team))
+ Get(new(organization.Team))
if err != nil {
return err
}
if has {
- return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
+ return organization.ErrTeamAlreadyExist{OrgID: t.OrgID, Name: t.LowerName}
}
ctx, committer, err := db.TxContext()
@@ -599,7 +307,7 @@ func NewTeam(t *Team) (err error) {
// Add all repositories to the team if it has access to all of them.
if t.IncludesAllRepositories {
- err = t.addAllRepositories(ctx)
+ err = addAllRepositories(ctx, t)
if err != nil {
return fmt.Errorf("addAllRepositories: %v", err)
}
@@ -612,81 +320,8 @@ func NewTeam(t *Team) (err error) {
return committer.Commit()
}
-func getTeam(e db.Engine, orgID int64, name string) (*Team, error) {
- t := &Team{
- OrgID: orgID,
- LowerName: strings.ToLower(name),
- }
- has, err := e.Get(t)
- if err != nil {
- return nil, err
- } else if !has {
- return nil, ErrTeamNotExist{orgID, 0, name}
- }
- return t, nil
-}
-
-// GetTeam returns team by given team name and organization.
-func GetTeam(orgID int64, name string) (*Team, error) {
- return getTeam(db.GetEngine(db.DefaultContext), orgID, name)
-}
-
-// GetTeamIDsByNames returns a slice of team ids corresponds to names.
-func GetTeamIDsByNames(orgID int64, names []string, ignoreNonExistent bool) ([]int64, error) {
- ids := make([]int64, 0, len(names))
- for _, name := range names {
- u, err := GetTeam(orgID, name)
- if err != nil {
- if ignoreNonExistent {
- continue
- } else {
- return nil, err
- }
- }
- ids = append(ids, u.ID)
- }
- return ids, nil
-}
-
-// getOwnerTeam returns team by given team name and organization.
-func getOwnerTeam(e db.Engine, orgID int64) (*Team, error) {
- return getTeam(e, orgID, ownerTeamName)
-}
-
-func getTeamByID(e db.Engine, teamID int64) (*Team, error) {
- t := new(Team)
- has, err := e.ID(teamID).Get(t)
- if err != nil {
- return nil, err
- } else if !has {
- return nil, ErrTeamNotExist{0, teamID, ""}
- }
- return t, nil
-}
-
-// GetTeamByID returns team by given ID.
-func GetTeamByID(teamID int64) (*Team, error) {
- return getTeamByID(db.GetEngine(db.DefaultContext), teamID)
-}
-
-// GetTeamNamesByID returns team's lower name from a list of team ids.
-func GetTeamNamesByID(teamIDs []int64) ([]string, error) {
- if len(teamIDs) == 0 {
- return []string{}, nil
- }
-
- var teamNames []string
- err := db.GetEngine(db.DefaultContext).Table("team").
- Select("lower_name").
- In("id", teamIDs).
- Asc("name").
- Find(&teamNames)
-
- return teamNames, err
-}
-
// UpdateTeam updates information of team.
-func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
+func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err error) {
if len(t.Name) == 0 {
return errors.New("empty team name")
}
@@ -707,11 +342,11 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
Where("org_id=?", t.OrgID).
And("lower_name=?", t.LowerName).
And("id!=?", t.ID).
- Get(new(Team))
+ Get(new(organization.Team))
if err != nil {
return err
} else if has {
- return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
+ return organization.ErrTeamAlreadyExist{OrgID: t.OrgID, Name: t.LowerName}
}
if _, err = sess.ID(t.ID).Cols("name", "lower_name", "description",
@@ -727,7 +362,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
// Delete team-unit.
if _, err := sess.
Where("team_id=?", t.ID).
- Delete(new(TeamUnit)); err != nil {
+ Delete(new(organization.TeamUnit)); err != nil {
return err
}
if _, err = sess.Cols("org_id", "team_id", "type", "access_mode").Insert(&t.Units); err != nil {
@@ -737,7 +372,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
// Update access for team members if needed.
if authChanged {
- if err = t.getRepositories(sess); err != nil {
+ if err = t.GetRepositoriesCtx(ctx); err != nil {
return fmt.Errorf("getRepositories: %v", err)
}
@@ -750,7 +385,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
// Add all repositories to the team if it has access to all of them.
if includeAllChanged && t.IncludesAllRepositories {
- err = t.addAllRepositories(ctx)
+ err = addAllRepositories(ctx, t)
if err != nil {
return fmt.Errorf("addAllRepositories: %v", err)
}
@@ -761,11 +396,7 @@ func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
// DeleteTeam deletes given team.
// It's caller's responsibility to assign organization ID.
-func DeleteTeam(t *Team) error {
- if err := t.GetRepositories(&SearchOrgTeamOptions{}); err != nil {
- return err
- }
-
+func DeleteTeam(t *organization.Team) error {
ctx, committer, err := db.TxContext()
if err != nil {
return err
@@ -773,7 +404,11 @@ func DeleteTeam(t *Team) error {
defer committer.Close()
sess := db.GetEngine(ctx)
- if err := t.getMembers(sess); err != nil {
+ if err := t.GetRepositoriesCtx(ctx); err != nil {
+ return err
+ }
+
+ if err := t.GetMembersCtx(ctx); err != nil {
return err
}
@@ -813,7 +448,7 @@ func DeleteTeam(t *Team) error {
}
if !t.IncludesAllRepositories {
- if err := t.removeAllRepositories(ctx); err != nil {
+ if err := removeAllRepositories(ctx, t); err != nil {
return err
}
}
@@ -822,19 +457,19 @@ func DeleteTeam(t *Team) error {
if _, err := sess.
Where("org_id=?", t.OrgID).
Where("team_id=?", t.ID).
- Delete(new(TeamUser)); err != nil {
+ Delete(new(organization.TeamUser)); err != nil {
return err
}
// Delete team-unit.
if _, err := sess.
Where("team_id=?", t.ID).
- Delete(new(TeamUnit)); err != nil {
+ Delete(new(organization.TeamUnit)); err != nil {
return err
}
// Delete team.
- if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil {
+ if _, err := sess.ID(t.ID).Delete(new(organization.Team)); err != nil {
return err
}
// Update organization number of teams.
@@ -845,103 +480,15 @@ func DeleteTeam(t *Team) error {
return committer.Commit()
}
-// ___________ ____ ___
-// \__ ___/___ _____ _____ | | \______ ___________
-// | |_/ __ \\__ \ / \| | / ___// __ \_ __ \
-// | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/
-// |____| \___ >____ /__|_| /______//____ >\___ >__|
-// \/ \/ \/ \/ \/
-
-// 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)"`
-}
-
-func isTeamMember(e db.Engine, orgID, teamID, userID int64) (bool, error) {
- return e.
- Where("org_id=?", orgID).
- And("team_id=?", teamID).
- And("uid=?", userID).
- Table("team_user").
- Exist()
-}
-
-// IsTeamMember returns true if given user is a member of team.
-func IsTeamMember(orgID, teamID, userID int64) (bool, error) {
- return isTeamMember(db.GetEngine(db.DefaultContext), orgID, teamID, userID)
-}
-
-func getTeamUsersByTeamID(e db.Engine, teamID int64) ([]*TeamUser, error) {
- teamUsers := make([]*TeamUser, 0, 10)
- return teamUsers, e.
- Where("team_id=?", teamID).
- Find(&teamUsers)
-}
-
-func getTeamMembers(e db.Engine, teamID int64) (_ []*user_model.User, err error) {
- teamUsers, err := getTeamUsersByTeamID(e, teamID)
- if err != nil {
- return nil, fmt.Errorf("get team-users: %v", err)
- }
- members := make([]*user_model.User, len(teamUsers))
- for i, teamUser := range teamUsers {
- member, err := user_model.GetUserByIDEngine(e, teamUser.UID)
- if err != nil {
- return nil, fmt.Errorf("get user '%d': %v", teamUser.UID, err)
- }
- members[i] = member
- }
- sort.Slice(members, func(i, j int) bool {
- return members[i].DisplayName() < members[j].DisplayName()
- })
- return members, nil
-}
-
-// GetTeamMembers returns all members in given team of organization.
-func GetTeamMembers(teamID int64) ([]*user_model.User, error) {
- return getTeamMembers(db.GetEngine(db.DefaultContext), teamID)
-}
-
-func getUserOrgTeams(e db.Engine, orgID, userID int64) (teams []*Team, err error) {
- return teams, e.
- Join("INNER", "team_user", "team_user.team_id = team.id").
- Where("team.org_id = ?", orgID).
- And("team_user.uid=?", userID).
- Find(&teams)
-}
-
-func getUserRepoTeams(e db.Engine, orgID, userID, repoID int64) (teams []*Team, err error) {
- return teams, e.
- 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)
-}
-
-// GetUserOrgTeams returns all teams that user belongs to in given organization.
-func GetUserOrgTeams(orgID, userID int64) ([]*Team, error) {
- return getUserOrgTeams(db.GetEngine(db.DefaultContext), orgID, userID)
-}
-
// AddTeamMember adds new membership of given team to given organization,
// the user will have membership to given organization automatically when needed.
-func AddTeamMember(team *Team, userID int64) error {
- isAlreadyMember, err := IsTeamMember(team.OrgID, team.ID, userID)
+func AddTeamMember(team *organization.Team, userID int64) error {
+ isAlreadyMember, err := organization.IsTeamMember(db.DefaultContext, team.OrgID, team.ID, userID)
if err != nil || isAlreadyMember {
return err
}
- if err := AddOrgUser(team.OrgID, userID); err != nil {
- return err
- }
-
- // Get team and its repositories.
- if err := team.GetRepositories(&SearchOrgTeamOptions{}); err != nil {
+ if err := organization.AddOrgUser(team.OrgID, userID); err != nil {
return err
}
@@ -951,15 +498,20 @@ func AddTeamMember(team *Team, userID int64) error {
}
defer committer.Close()
+ // Get team and its repositories.
+ if err := team.GetRepositoriesCtx(ctx); err != nil {
+ return err
+ }
+
sess := db.GetEngine(ctx)
- if err := db.Insert(ctx, &TeamUser{
+ if err := db.Insert(ctx, &organization.TeamUser{
UID: userID,
OrgID: team.OrgID,
TeamID: team.ID,
}); err != nil {
return err
- } else if _, err := sess.Incr("num_members").ID(team.ID).Update(new(Team)); err != nil {
+ } else if _, err := sess.Incr("num_members").ID(team.ID).Update(new(organization.Team)); err != nil {
return err
}
@@ -980,25 +532,25 @@ func AddTeamMember(team *Team, userID int64) error {
return committer.Commit()
}
-func removeTeamMember(ctx context.Context, team *Team, userID int64) error {
+func removeTeamMember(ctx context.Context, team *organization.Team, userID int64) error {
e := db.GetEngine(ctx)
- isMember, err := isTeamMember(e, team.OrgID, team.ID, userID)
+ isMember, err := organization.IsTeamMember(ctx, team.OrgID, team.ID, userID)
if err != nil || !isMember {
return err
}
// Check if the user to delete is the last member in owner team.
if team.IsOwnerTeam() && team.NumMembers == 1 {
- return ErrLastOrgOwner{UID: userID}
+ return organization.ErrLastOrgOwner{UID: userID}
}
team.NumMembers--
- if err := team.getRepositories(e); err != nil {
+ if err := team.GetRepositoriesCtx(ctx); err != nil {
return err
}
- if _, err := e.Delete(&TeamUser{
+ if _, err := e.Delete(&organization.TeamUser{
UID: userID,
OrgID: team.OrgID,
TeamID: team.ID,
@@ -1029,7 +581,7 @@ func removeTeamMember(ctx context.Context, team *Team, userID int64) error {
}
// Check if the user is a member of any team in the organization.
- if count, err := e.Count(&TeamUser{
+ if count, err := e.Count(&organization.TeamUser{
UID: userID,
OrgID: team.OrgID,
}); err != nil {
@@ -1042,7 +594,7 @@ func removeTeamMember(ctx context.Context, team *Team, userID int64) error {
}
// RemoveTeamMember removes member from given team of given organization.
-func RemoveTeamMember(team *Team, userID int64) error {
+func RemoveTeamMember(team *organization.Team, userID int64) error {
ctx, committer, err := db.TxContext()
if err != nil {
return err
@@ -1053,125 +605,3 @@ func RemoveTeamMember(team *Team, userID int64) error {
}
return committer.Commit()
}
-
-// IsUserInTeams returns if a user in some teams
-func IsUserInTeams(userID int64, teamIDs []int64) (bool, error) {
- return isUserInTeams(db.GetEngine(db.DefaultContext), userID, teamIDs)
-}
-
-func isUserInTeams(e db.Engine, userID int64, teamIDs []int64) (bool, error) {
- return e.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
-}
-
-// ___________ __________
-// \__ ___/___ _____ _____\______ \ ____ ______ ____
-// | |_/ __ \\__ \ / \| _// __ \\____ \ / _ \
-// | |\ ___/ / __ \| Y Y \ | \ ___/| |_> > <_> )
-// |____| \___ >____ /__|_| /____|_ /\___ > __/ \____/
-// \/ \/ \/ \/ \/|__|
-
-// 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)"`
-}
-
-func hasTeamRepo(e db.Engine, orgID, teamID, repoID int64) bool {
- has, _ := e.
- Where("org_id=?", orgID).
- And("team_id=?", teamID).
- And("repo_id=?", repoID).
- Get(new(TeamRepo))
- return has
-}
-
-// HasTeamRepo returns true if given repository belongs to team.
-func HasTeamRepo(orgID, teamID, repoID int64) bool {
- return hasTeamRepo(db.GetEngine(db.DefaultContext), orgID, teamID, repoID)
-}
-
-func addTeamRepo(e db.Engine, orgID, teamID, repoID int64) error {
- _, err := e.InsertOne(&TeamRepo{
- OrgID: orgID,
- TeamID: teamID,
- RepoID: repoID,
- })
- return err
-}
-
-func removeTeamRepo(e db.Engine, teamID, repoID int64) error {
- _, err := e.Delete(&TeamRepo{
- TeamID: teamID,
- RepoID: repoID,
- })
- return err
-}
-
-// GetTeamsWithAccessToRepo returns all teams in an organization that have given access level to the repository.
-func GetTeamsWithAccessToRepo(orgID, repoID int64, mode perm.AccessMode) ([]*Team, error) {
- teams := make([]*Team, 0, 5)
- return teams, db.GetEngine(db.DefaultContext).Where("team.authorize >= ?", mode).
- Join("INNER", "team_repo", "team_repo.team_id = team.id").
- And("team_repo.org_id = ?", orgID).
- And("team_repo.repo_id = ?", repoID).
- Find(&teams)
-}
-
-// ___________ ____ ___ .__ __
-// \__ ___/___ _____ _____ | | \____ |__|/ |_
-// | |_/ __ \\__ \ / \| | / \| \ __\
-// | |\ ___/ / __ \| Y Y \ | / | \ || |
-// |____| \___ >____ /__|_| /______/|___| /__||__|
-// \/ \/ \/ \/
-
-// TeamUnit describes all units of a repository
-type TeamUnit struct {
- ID int64 `xorm:"pk autoincr"`
- OrgID int64 `xorm:"INDEX"`
- TeamID int64 `xorm:"UNIQUE(s)"`
- Type unit.Type `xorm:"UNIQUE(s)"`
- AccessMode perm.AccessMode
-}
-
-// Unit returns Unit
-func (t *TeamUnit) Unit() unit.Unit {
- return unit.Units[t.Type]
-}
-
-func getUnitsByTeamID(e db.Engine, teamID int64) (units []*TeamUnit, err error) {
- return units, e.Where("team_id = ?", teamID).Find(&units)
-}
-
-// UpdateTeamUnits updates a teams's units
-func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) {
- ctx, committer, err := db.TxContext()
- if err != nil {
- return err
- }
- defer committer.Close()
-
- if _, err = db.GetEngine(ctx).Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil {
- return err
- }
-
- if len(units) > 0 {
- if err = db.Insert(ctx, units); err != nil {
- return err
- }
- }
-
- return committer.Commit()
-}